| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (c) 2008 Vitor Sessak | 2 * Copyright (c) 2008 Vitor Sessak |
| 3 * | 3 * |
| 4 * This file is part of FFmpeg. | 4 * This file is part of FFmpeg. |
| 5 * | 5 * |
| 6 * FFmpeg is free software; you can redistribute it and/or | 6 * FFmpeg is free software; you can redistribute it and/or |
| 7 * modify it under the terms of the GNU Lesser General Public | 7 * modify it under the terms of the GNU Lesser General Public |
| 8 * License as published by the Free Software Foundation; either | 8 * License as published by the Free Software Foundation; either |
| 9 * version 2.1 of the License, or (at your option) any later version. | 9 * version 2.1 of the License, or (at your option) any later version. |
| 10 * | 10 * |
| (...skipping 15 matching lines...) Expand all Loading... |
| 26 #include "avfilter.h" | 26 #include "avfilter.h" |
| 27 #include "vsrc_buffer.h" | 27 #include "vsrc_buffer.h" |
| 28 #include "libavcore/imgutils.h" | 28 #include "libavcore/imgutils.h" |
| 29 | 29 |
| 30 typedef struct { | 30 typedef struct { |
| 31 int64_t pts; | 31 int64_t pts; |
| 32 AVFrame frame; | 32 AVFrame frame; |
| 33 int has_frame; | 33 int has_frame; |
| 34 int h, w; | 34 int h, w; |
| 35 enum PixelFormat pix_fmt; | 35 enum PixelFormat pix_fmt; |
| 36 AVRational time_base; ///< time_base to set in the output link |
| 36 AVRational pixel_aspect; | 37 AVRational pixel_aspect; |
| 37 } BufferSourceContext; | 38 } BufferSourceContext; |
| 38 | 39 |
| 39 int av_vsrc_buffer_add_frame(AVFilterContext *buffer_filter, AVFrame *frame, | 40 int av_vsrc_buffer_add_frame(AVFilterContext *buffer_filter, AVFrame *frame, |
| 40 int64_t pts, AVRational pixel_aspect) | 41 int64_t pts, AVRational pixel_aspect) |
| 41 { | 42 { |
| 42 BufferSourceContext *c = buffer_filter->priv; | 43 BufferSourceContext *c = buffer_filter->priv; |
| 43 | 44 |
| 44 if (c->has_frame) { | 45 if (c->has_frame) { |
| 45 av_log(buffer_filter, AV_LOG_ERROR, | 46 av_log(buffer_filter, AV_LOG_ERROR, |
| (...skipping 13 matching lines...) Expand all Loading... |
| 59 | 60 |
| 60 return 0; | 61 return 0; |
| 61 } | 62 } |
| 62 | 63 |
| 63 static av_cold int init(AVFilterContext *ctx, const char *args, void *opaque) | 64 static av_cold int init(AVFilterContext *ctx, const char *args, void *opaque) |
| 64 { | 65 { |
| 65 BufferSourceContext *c = ctx->priv; | 66 BufferSourceContext *c = ctx->priv; |
| 66 char pix_fmt_str[128]; | 67 char pix_fmt_str[128]; |
| 67 int n = 0; | 68 int n = 0; |
| 68 | 69 |
| 69 if (!args || (n = sscanf(args, "%d:%d:%127s", &c->w, &c->h, pix_fmt_str)) !=
3) { | 70 if (!args || |
| 70 av_log(ctx, AV_LOG_ERROR, "Expected 3 arguments, but only %d found in '%
s'\n", n, args ? args : ""); | 71 (n = sscanf(args, "%d:%d:%127[^:]:%d:%d", &c->w, &c->h, pix_fmt_str, &c-
>time_base.num, &c->time_base.den)) != 5) { |
| 72 av_log(ctx, AV_LOG_ERROR, "Expected 5 arguments, but only %d found in '%
s'\n", n, args); |
| 71 return AVERROR(EINVAL); | 73 return AVERROR(EINVAL); |
| 72 } | 74 } |
| 73 if ((c->pix_fmt = av_get_pix_fmt(pix_fmt_str)) == PIX_FMT_NONE) { | 75 if ((c->pix_fmt = av_get_pix_fmt(pix_fmt_str)) == PIX_FMT_NONE) { |
| 74 char *tail; | 76 char *tail; |
| 75 c->pix_fmt = strtol(pix_fmt_str, &tail, 10); | 77 c->pix_fmt = strtol(pix_fmt_str, &tail, 10); |
| 76 if (*tail || c->pix_fmt < 0 || c->pix_fmt >= PIX_FMT_NB) { | 78 if (*tail || c->pix_fmt < 0 || c->pix_fmt >= PIX_FMT_NB) { |
| 77 av_log(ctx, AV_LOG_ERROR, "Invalid pixel format string '%s'\n", pix_
fmt_str); | 79 av_log(ctx, AV_LOG_ERROR, "Invalid pixel format string '%s'\n", pix_
fmt_str); |
| 78 return AVERROR(EINVAL); | 80 return AVERROR(EINVAL); |
| 79 } | 81 } |
| 80 } | 82 } |
| (...skipping 10 matching lines...) Expand all Loading... |
| 91 avfilter_set_common_formats(ctx, avfilter_make_format_list(pix_fmts)); | 93 avfilter_set_common_formats(ctx, avfilter_make_format_list(pix_fmts)); |
| 92 return 0; | 94 return 0; |
| 93 } | 95 } |
| 94 | 96 |
| 95 static int config_props(AVFilterLink *link) | 97 static int config_props(AVFilterLink *link) |
| 96 { | 98 { |
| 97 BufferSourceContext *c = link->src->priv; | 99 BufferSourceContext *c = link->src->priv; |
| 98 | 100 |
| 99 link->w = c->w; | 101 link->w = c->w; |
| 100 link->h = c->h; | 102 link->h = c->h; |
| 103 link->time_base = c->time_base; |
| 101 | 104 |
| 102 return 0; | 105 return 0; |
| 103 } | 106 } |
| 104 | 107 |
| 105 static int request_frame(AVFilterLink *link) | 108 static int request_frame(AVFilterLink *link) |
| 106 { | 109 { |
| 107 BufferSourceContext *c = link->src->priv; | 110 BufferSourceContext *c = link->src->priv; |
| 108 AVFilterBufferRef *picref; | 111 AVFilterBufferRef *picref; |
| 109 | 112 |
| 110 if (!c->has_frame) { | 113 if (!c->has_frame) { |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 152 .init = init, | 155 .init = init, |
| 153 | 156 |
| 154 .inputs = (AVFilterPad[]) {{ .name = NULL }}, | 157 .inputs = (AVFilterPad[]) {{ .name = NULL }}, |
| 155 .outputs = (AVFilterPad[]) {{ .name = "default", | 158 .outputs = (AVFilterPad[]) {{ .name = "default", |
| 156 .type = AVMEDIA_TYPE_VIDEO, | 159 .type = AVMEDIA_TYPE_VIDEO, |
| 157 .request_frame = request_frame, | 160 .request_frame = request_frame, |
| 158 .poll_frame = poll_frame, | 161 .poll_frame = poll_frame, |
| 159 .config_props = config_props, }, | 162 .config_props = config_props, }, |
| 160 { .name = NULL}}, | 163 { .name = NULL}}, |
| 161 }; | 164 }; |
| OLD | NEW |