History

lavfi: add frame counter into AVFilterLink and use it in filters.

Clément Bœsch committed 13 years ago

Commit b8a5c761 parent f4596e815 files · +27 −33Browse files

Unified · Split

15 files
  1. libavfilter/avfilter.c +1 −0
  2. libavfilter/avfilter.h +5 −0
  3. libavfilter/f_select.c +1 −1
  4. libavfilter/vf_blackdetect.c +2 −4
  5. libavfilter/vf_blend.c +1 −2
  6. libavfilter/vf_crop.c +1 −2
  7. libavfilter/vf_decimate.c +1 −2
  8. libavfilter/vf_drawtext.c +3 −4
  9. libavfilter/vf_fieldmatch.c +3 −5
  10. libavfilter/vf_framestep.c +2 −2
  11. libavfilter/vf_geq.c +1 −2
  12. libavfilter/vf_hue.c +1 −2
  13. libavfilter/vf_overlay.c +1 −1
  14. libavfilter/vf_separatefields.c +3 −4
  15. libavfilter/vf_telecine.c +1 −2
libavfilter/avfilter.c+1−0
@@ -915,6 +915,7 @@ static int ff_filter_frame_framed(AVFilterLink *link, AVFrame *frame) · 914 unmodified lines
915 915
916 pts = out->pts;916 pts = out->pts;
917 ret = filter_frame(link, out);917 ret = filter_frame(link, out);
918 link->frame_count++;
918 link->frame_requested = 0;919 link->frame_requested = 0;
919 ff_update_link_current_pts(link, pts);920 ff_update_link_current_pts(link, pts);
920 return ret;921 return ret;
libavfilter/avfilter.h+5−0
@@ -718,6 +718,11 @@ struct AVFilterLink { · 717 unmodified lines
718 * Link processing flags.718 * Link processing flags.
719 */719 */
720 unsigned flags;720 unsigned flags;
721
722 /**
723 * Number of past frames sent through the link.
724 */
725 int64_t frame_count;
721};726};
722 727
723/**728/**
libavfilter/f_select.c+1−1
@@ -283,6 +283,7 @@ static void select_frame(AVFilterContext *ctx, AVFrame *frame) · 282 unmodified lines
283 if (isnan(select->var_values[VAR_START_T]))283 if (isnan(select->var_values[VAR_START_T]))
284 select->var_values[VAR_START_T] = TS2D(frame->pts) * av_q2d(inlink->time_base);284 select->var_values[VAR_START_T] = TS2D(frame->pts) * av_q2d(inlink->time_base);
285 285
286 select->var_values[VAR_N ] = inlink->frame_count;
286 select->var_values[VAR_PTS] = TS2D(frame->pts);287 select->var_values[VAR_PTS] = TS2D(frame->pts);
287 select->var_values[VAR_T ] = TS2D(frame->pts) * av_q2d(inlink->time_base);288 select->var_values[VAR_T ] = TS2D(frame->pts) * av_q2d(inlink->time_base);
288 select->var_values[VAR_POS] = av_frame_get_pkt_pos(frame) == -1 ? NAN : av_frame_get_pkt_pos(frame);289 select->var_values[VAR_POS] = av_frame_get_pkt_pos(frame) == -1 ? NAN : av_frame_get_pkt_pos(frame);
@@ -352,7 +353,6 @@ static void select_frame(AVFilterContext *ctx, AVFrame *frame) · 63 unmodified lines
352 select->var_values[VAR_CONSUMED_SAMPLES_N] += frame->nb_samples;353 select->var_values[VAR_CONSUMED_SAMPLES_N] += frame->nb_samples;
353 }354 }
354 355
355 select->var_values[VAR_N] += 1.0;
356 select->var_values[VAR_PREV_PTS] = select->var_values[VAR_PTS];356 select->var_values[VAR_PREV_PTS] = select->var_values[VAR_PTS];
357 select->var_values[VAR_PREV_T] = select->var_values[VAR_T];357 select->var_values[VAR_PREV_T] = select->var_values[VAR_T];
358}358}
libavfilter/vf_blackdetect.c+2−4
@@ -43,7 +43,6 @@ typedef struct { · 42 unmodified lines
43 double pixel_black_th;43 double pixel_black_th;
44 unsigned int pixel_black_th_i;44 unsigned int pixel_black_th_i;
45 45
46 unsigned int frame_count; ///< frame number
47 unsigned int nb_black_pixels; ///< number of black pixels counted so far46 unsigned int nb_black_pixels; ///< number of black pixels counted so far
48} BlackDetectContext;47} BlackDetectContext;
49 48
@@ -149,8 +148,8 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *picref) · 99 unmodified lines
149 picture_black_ratio = (double)blackdetect->nb_black_pixels / (inlink->w * inlink->h);148 picture_black_ratio = (double)blackdetect->nb_black_pixels / (inlink->w * inlink->h);
150 149
151 av_log(ctx, AV_LOG_DEBUG,150 av_log(ctx, AV_LOG_DEBUG,
152 "frame:%u picture_black_ratio:%f pts:%s t:%s type:%c\n",151 "frame:%"PRId64" picture_black_ratio:%f pts:%s t:%s type:%c\n",
153 blackdetect->frame_count, picture_black_ratio,152 inlink->frame_count, picture_black_ratio,
154 av_ts2str(picref->pts), av_ts2timestr(picref->pts, &inlink->time_base),153 av_ts2str(picref->pts), av_ts2timestr(picref->pts, &inlink->time_base),
155 av_get_picture_type_char(picref->pict_type));154 av_get_picture_type_char(picref->pict_type));
156 155
@@ -168,7 +167,6 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *picref) · 11 unmodified lines
168 }167 }
169 168
170 blackdetect->last_picref_pts = picref->pts;169 blackdetect->last_picref_pts = picref->pts;
171 blackdetect->frame_count++;
172 blackdetect->nb_black_pixels = 0;170 blackdetect->nb_black_pixels = 0;
173 return ff_filter_frame(inlink->dst->outputs[0], picref);171 return ff_filter_frame(inlink->dst->outputs[0], picref);
174}172}
libavfilter/vf_blend.c+1−2
@@ -81,7 +81,6 @@ typedef struct { · 80 unmodified lines
81 struct FFBufQueue queue_bottom;81 struct FFBufQueue queue_bottom;
82 int hsub, vsub; ///< chroma subsampling values82 int hsub, vsub; ///< chroma subsampling values
83 int frame_requested;83 int frame_requested;
84 int framenum;
85 char *all_expr;84 char *all_expr;
86 enum BlendMode all_mode;85 enum BlendMode all_mode;
87 double all_opacity;86 double all_opacity;
@@ -382,7 +381,7 @@ static void blend_frame(AVFilterContext *ctx, · 294 unmodified lines
382 uint8_t *bottom = bottom_buf->data[plane];381 uint8_t *bottom = bottom_buf->data[plane];
383 382
384 param = &b->params[plane];383 param = &b->params[plane];
385 param->values[VAR_N] = b->framenum++;384 param->values[VAR_N] = inlink->frame_count;
386 param->values[VAR_T] = dst_buf->pts == AV_NOPTS_VALUE ? NAN : dst_buf->pts * av_q2d(inlink->time_base);385 param->values[VAR_T] = dst_buf->pts == AV_NOPTS_VALUE ? NAN : dst_buf->pts * av_q2d(inlink->time_base);
387 param->values[VAR_W] = outw;386 param->values[VAR_W] = outw;
388 param->values[VAR_H] = outh;387 param->values[VAR_H] = outh;
libavfilter/vf_crop.c+1−2
@@ -259,6 +259,7 @@ static int filter_frame(AVFilterLink *link, AVFrame *frame) · 258 unmodified lines
259 frame->width = crop->w;259 frame->width = crop->w;
260 frame->height = crop->h;260 frame->height = crop->h;
261 261
262 crop->var_values[VAR_N] = link->frame_count;
262 crop->var_values[VAR_T] = frame->pts == AV_NOPTS_VALUE ?263 crop->var_values[VAR_T] = frame->pts == AV_NOPTS_VALUE ?
263 NAN : frame->pts * av_q2d(link->time_base);264 NAN : frame->pts * av_q2d(link->time_base);
264 crop->var_values[VAR_POS] = av_frame_get_pkt_pos(frame) == -1 ?265 crop->var_values[VAR_POS] = av_frame_get_pkt_pos(frame) == -1 ?
@@ -299,8 +300,6 @@ static int filter_frame(AVFilterLink *link, AVFrame *frame) · 34 unmodified lines
299 frame->data[3] += crop->x * crop->max_step[3];300 frame->data[3] += crop->x * crop->max_step[3];
300 }301 }
301 302
302 crop->var_values[VAR_N] += 1.0;
303
304 return ff_filter_frame(link->dst->outputs[0], frame);303 return ff_filter_frame(link->dst->outputs[0], frame);
305}304}
306 305
libavfilter/vf_decimate.c+1−2
@@ -40,7 +40,6 @@ typedef struct { · 39 unmodified lines
40 int fid; ///< current frame id in the queue40 int fid; ///< current frame id in the queue
41 int filled; ///< 1 if the queue is filled, 0 otherwise41 int filled; ///< 1 if the queue is filled, 0 otherwise
42 AVFrame *last; ///< last frame from the previous queue42 AVFrame *last; ///< last frame from the previous queue
43 int64_t frame_count; ///< output frame counter
44 AVFrame **clean_src; ///< frame queue for the clean source43 AVFrame **clean_src; ///< frame queue for the clean source
45 int got_frame[2]; ///< frame request flag for each input stream44 int got_frame[2]; ///< frame request flag for each input stream
46 double ts_unit; ///< timestamp units for the output frames45 double ts_unit; ///< timestamp units for the output frames
@@ -215,7 +214,7 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in) · 168 unmodified lines
215 av_frame_free(&frame);214 av_frame_free(&frame);
216 frame = dm->clean_src[i];215 frame = dm->clean_src[i];
217 }216 }
218 frame->pts = dm->frame_count++ * dm->ts_unit;217 frame->pts = outlink->frame_count * dm->ts_unit;
219 ret = ff_filter_frame(outlink, frame);218 ret = ff_filter_frame(outlink, frame);
220 if (ret < 0)219 if (ret < 0)
221 break;220 break;
libavfilter/vf_drawtext.c+3−4
@@ -164,7 +164,6 @@ typedef struct { · 163 unmodified lines
164 AVRational tc_rate; ///< frame rate for timecode164 AVRational tc_rate; ///< frame rate for timecode
165 AVTimecode tc; ///< timecode context165 AVTimecode tc; ///< timecode context
166 int tc24hmax; ///< 1 if timecode is wrapped to 24 hours, 0 otherwise166 int tc24hmax; ///< 1 if timecode is wrapped to 24 hours, 0 otherwise
167 int frame_id;
168 int reload; ///< reload text file for each frame167 int reload; ///< reload text file for each frame
169} DrawTextContext;168} DrawTextContext;
170 169
@@ -820,6 +819,7 @@ static int draw_text(AVFilterContext *ctx, AVFrame *frame, · 649 unmodified lines
820 int width, int height)819 int width, int height)
821{820{
822 DrawTextContext *dtext = ctx->priv;821 DrawTextContext *dtext = ctx->priv;
822 AVFilterLink *inlink = ctx->inputs[0];
823 uint32_t code = 0, prev_code = 0;823 uint32_t code = 0, prev_code = 0;
824 int x = 0, y = 0, i = 0, ret;824 int x = 0, y = 0, i = 0, ret;
825 int max_text_line_w = 0, len;825 int max_text_line_w = 0, len;
@@ -857,7 +857,7 @@ static int draw_text(AVFilterContext *ctx, AVFrame *frame, · 31 unmodified lines
857 857
858 if (dtext->tc_opt_string) {858 if (dtext->tc_opt_string) {
859 char tcbuf[AV_TIMECODE_STR_SIZE];859 char tcbuf[AV_TIMECODE_STR_SIZE];
860 av_timecode_make_string(&dtext->tc, tcbuf, dtext->frame_id++);860 av_timecode_make_string(&dtext->tc, tcbuf, inlink->frame_count);
861 av_bprint_clear(bp);861 av_bprint_clear(bp);
862 av_bprintf(bp, "%s%s", dtext->text, tcbuf);862 av_bprintf(bp, "%s%s", dtext->text, tcbuf);
863 }863 }
@@ -983,6 +983,7 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *frame) · 119 unmodified lines
983 if ((ret = load_textfile(ctx)) < 0)983 if ((ret = load_textfile(ctx)) < 0)
984 return ret;984 return ret;
985 985
986 dtext->var_values[VAR_N] = inlink->frame_count;
986 dtext->var_values[VAR_T] = frame->pts == AV_NOPTS_VALUE ?987 dtext->var_values[VAR_T] = frame->pts == AV_NOPTS_VALUE ?
987 NAN : frame->pts * av_q2d(inlink->time_base);988 NAN : frame->pts * av_q2d(inlink->time_base);
988 989
@@ -993,8 +994,6 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *frame) · 4 unmodified lines
993 (int)dtext->var_values[VAR_TEXT_W], (int)dtext->var_values[VAR_TEXT_H],994 (int)dtext->var_values[VAR_TEXT_W], (int)dtext->var_values[VAR_TEXT_H],
994 dtext->x, dtext->y);995 dtext->x, dtext->y);
995 996
996 dtext->var_values[VAR_N] += 1.0;
997
998 return ff_filter_frame(outlink, frame);997 return ff_filter_frame(outlink, frame);
999}998}
1000 999
libavfilter/vf_fieldmatch.c+3−5
@@ -77,7 +77,6 @@ typedef struct { · 76 unmodified lines
77 77
78 AVFrame *prv, *src, *nxt; ///< main sliding window of 3 frames78 AVFrame *prv, *src, *nxt; ///< main sliding window of 3 frames
79 AVFrame *prv2, *src2, *nxt2; ///< sliding window of the optional second stream79 AVFrame *prv2, *src2, *nxt2; ///< sliding window of the optional second stream
80 int64_t frame_count; ///< output frame counter
81 int got_frame[2]; ///< frame request flag for each input stream80 int got_frame[2]; ///< frame request flag for each input stream
82 int hsub, vsub; ///< chroma subsampling values81 int hsub, vsub; ///< chroma subsampling values
83 uint32_t eof; ///< bitmask for end of stream82 uint32_t eof; ///< bitmask for end of stream
@@ -738,7 +737,7 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in) · 654 unmodified lines
738 737
739 /* scene change check */738 /* scene change check */
740 if (fm->combmatch == COMBMATCH_SC) {739 if (fm->combmatch == COMBMATCH_SC) {
741 if (fm->lastn == fm->frame_count - 1) {740 if (fm->lastn == outlink->frame_count - 1) {
742 if (fm->lastscdiff > fm->scthresh)741 if (fm->lastscdiff > fm->scthresh)
743 sc = 1;742 sc = 1;
744 } else if (luma_abs_diff(fm->prv, fm->src) > fm->scthresh) {743 } else if (luma_abs_diff(fm->prv, fm->src) > fm->scthresh) {
@@ -746,7 +745,7 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in) · 1 unmodified line
746 }745 }
747 746
748 if (!sc) {747 if (!sc) {
749 fm->lastn = fm->frame_count;748 fm->lastn = outlink->frame_count;
750 fm->lastscdiff = luma_abs_diff(fm->src, fm->nxt);749 fm->lastscdiff = luma_abs_diff(fm->src, fm->nxt);
751 sc = fm->lastscdiff > fm->scthresh;750 sc = fm->lastscdiff > fm->scthresh;
752 }751 }
@@ -805,10 +804,9 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in) · 52 unmodified lines
805 dst->interlaced_frame = combs[match] >= fm->combpel;804 dst->interlaced_frame = combs[match] >= fm->combpel;
806 if (dst->interlaced_frame) {805 if (dst->interlaced_frame) {
807 av_log(ctx, AV_LOG_WARNING, "Frame #%"PRId64" at %s is still interlaced\n",806 av_log(ctx, AV_LOG_WARNING, "Frame #%"PRId64" at %s is still interlaced\n",
808 fm->frame_count, av_ts2timestr(in->pts, &inlink->time_base));807 outlink->frame_count, av_ts2timestr(in->pts, &inlink->time_base));
809 dst->top_field_first = field;808 dst->top_field_first = field;
810 }809 }
811 fm->frame_count++;
812 810
813 av_log(ctx, AV_LOG_DEBUG, "SC:%d | COMBS: %3d %3d %3d %3d %3d (combpel=%d)"811 av_log(ctx, AV_LOG_DEBUG, "SC:%d | COMBS: %3d %3d %3d %3d %3d (combpel=%d)"
814 " match=%d combed=%s\n", sc, combs[0], combs[1], combs[2], combs[3], combs[4],812 " match=%d combed=%s\n", sc, combs[0], combs[1], combs[2], combs[3], combs[4],
libavfilter/vf_framestep.c+2−2
@@ -30,7 +30,7 @@ · 29 unmodified lines
30 30
31typedef struct {31typedef struct {
32 const AVClass *class;32 const AVClass *class;
33 int frame_step, frame_count;33 int frame_step;
34} FrameStepContext;34} FrameStepContext;
35 35
36#define OFFSET(x) offsetof(FrameStepContext, x)36#define OFFSET(x) offsetof(FrameStepContext, x)
@@ -64,7 +64,7 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *ref) · 27 unmodified lines
64{64{
65 FrameStepContext *framestep = inlink->dst->priv;65 FrameStepContext *framestep = inlink->dst->priv;
66 66
67 if (!(framestep->frame_count++ % framestep->frame_step)) {67 if (!(inlink->frame_count % framestep->frame_step)) {
68 return ff_filter_frame(inlink->dst->outputs[0], ref);68 return ff_filter_frame(inlink->dst->outputs[0], ref);
69 } else {69 } else {
70 av_frame_free(&ref);70 av_frame_free(&ref);
libavfilter/vf_geq.c+1−2
@@ -36,7 +36,6 @@ typedef struct { · 35 unmodified lines
36 const AVClass *class;36 const AVClass *class;
37 AVExpr *e[4]; ///< expressions for each plane37 AVExpr *e[4]; ///< expressions for each plane
38 char *expr_str[4]; ///< expression strings for each plane38 char *expr_str[4]; ///< expression strings for each plane
39 int framenum; ///< frame counter
40 AVFrame *picref; ///< current input buffer39 AVFrame *picref; ///< current input buffer
41 int hsub, vsub; ///< chroma subsampling40 int hsub, vsub; ///< chroma subsampling
42 int planes; ///< number of planes41 int planes; ///< number of planes
@@ -163,7 +162,7 @@ static int geq_filter_frame(AVFilterLink *inlink, AVFrame *in) · 120 unmodified lines
163 AVFilterLink *outlink = inlink->dst->outputs[0];162 AVFilterLink *outlink = inlink->dst->outputs[0];
164 AVFrame *out;163 AVFrame *out;
165 double values[VAR_VARS_NB] = {164 double values[VAR_VARS_NB] = {
166 [VAR_N] = geq->framenum++,165 [VAR_N] = inlink->frame_count,
167 [VAR_T] = in->pts == AV_NOPTS_VALUE ? NAN : in->pts * av_q2d(inlink->time_base),166 [VAR_T] = in->pts == AV_NOPTS_VALUE ? NAN : in->pts * av_q2d(inlink->time_base),
168 };167 };
169 168
libavfilter/vf_hue.c+1−2
@@ -252,6 +252,7 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *inpic) · 251 unmodified lines
252 av_frame_copy_props(outpic, inpic);252 av_frame_copy_props(outpic, inpic);
253 }253 }
254 254
255 hue->var_values[VAR_N] = inlink->frame_count;
255 hue->var_values[VAR_T] = TS2T(inpic->pts, inlink->time_base);256 hue->var_values[VAR_T] = TS2T(inpic->pts, inlink->time_base);
256 hue->var_values[VAR_PTS] = TS2D(inpic->pts);257 hue->var_values[VAR_PTS] = TS2D(inpic->pts);
257 258
@@ -281,8 +282,6 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *inpic) · 23 unmodified lines
281 282
282 compute_sin_and_cos(hue);283 compute_sin_and_cos(hue);
283 284
284 hue->var_values[VAR_N] += 1;
285
286 if (!direct) {285 if (!direct) {
287 av_image_copy_plane(outpic->data[0], outpic->linesize[0],286 av_image_copy_plane(outpic->data[0], outpic->linesize[0],
288 inpic->data[0], inpic->linesize[0],287 inpic->data[0], inpic->linesize[0],
libavfilter/vf_overlay.c+1−1
@@ -600,6 +600,7 @@ static int try_filter_frame(AVFilterContext *ctx, AVFrame *mainpic) · 599 unmodified lines
600 if (over->eval_mode == EVAL_MODE_FRAME) {600 if (over->eval_mode == EVAL_MODE_FRAME) {
601 int64_t pos = av_frame_get_pkt_pos(mainpic);601 int64_t pos = av_frame_get_pkt_pos(mainpic);
602 602
603 over->var_values[VAR_N] = inlink->frame_count;
603 over->var_values[VAR_T] = mainpic->pts == AV_NOPTS_VALUE ?604 over->var_values[VAR_T] = mainpic->pts == AV_NOPTS_VALUE ?
604 NAN : mainpic->pts * av_q2d(inlink->time_base);605 NAN : mainpic->pts * av_q2d(inlink->time_base);
605 over->var_values[VAR_POS] = pos == -1 ? NAN : pos;606 over->var_values[VAR_POS] = pos == -1 ? NAN : pos;
@@ -614,7 +615,6 @@ static int try_filter_frame(AVFilterContext *ctx, AVFrame *mainpic) · 8 unmodified lines
614 if (over->enable)615 if (over->enable)
615 blend_image(ctx, mainpic, over->overpicref, over->x, over->y);616 blend_image(ctx, mainpic, over->overpicref, over->x, over->y);
616 617
617 over->var_values[VAR_N] += 1.0;
618 }618 }
619 ret = ff_filter_frame(ctx->outputs[0], mainpic);619 ret = ff_filter_frame(ctx->outputs[0], mainpic);
620 av_assert1(ret != AVERROR(EAGAIN));620 av_assert1(ret != AVERROR(EAGAIN));
libavfilter/vf_separatefields.c+3−4
@@ -24,7 +24,6 @@ · 23 unmodified lines
24 24
25typedef struct {25typedef struct {
26 int nb_planes;26 int nb_planes;
27 int64_t frame_count;
28 double ts_unit;27 double ts_unit;
29} SeparateFieldsContext;28} SeparateFieldsContext;
30 29
@@ -76,12 +75,12 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *inpicref) · 45 unmodified lines
76 second->linesize[i] *= 2;75 second->linesize[i] *= 2;
77 }76 }
78 77
79 inpicref->pts = sf->frame_count++ * sf->ts_unit;78 inpicref->pts = outlink->frame_count * sf->ts_unit;
80 second->pts = sf->frame_count++ * sf->ts_unit;
81
82 ret = ff_filter_frame(outlink, inpicref);79 ret = ff_filter_frame(outlink, inpicref);
83 if (ret < 0)80 if (ret < 0)
84 return ret;81 return ret;
82
83 second->pts = outlink->frame_count * sf->ts_unit;
85 return ff_filter_frame(outlink, second);84 return ff_filter_frame(outlink, second);
86}85}
87 86
libavfilter/vf_telecine.c+1−2
@@ -43,7 +43,6 @@ typedef struct { · 42 unmodified lines
43 double ts_unit;43 double ts_unit;
44 int out_cnt;44 int out_cnt;
45 int occupied;45 int occupied;
46 int64_t frame_count;
47 46
48 int nb_planes;47 int nb_planes;
49 int planeheight[4];48 int planeheight[4];
@@ -233,7 +232,7 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *inpicref) · 183 unmodified lines
233 }232 }
234 233
235 av_frame_copy_props(frame, inpicref);234 av_frame_copy_props(frame, inpicref);
236 frame->pts = tc->frame_count++ * tc->ts_unit;235 frame->pts = outlink->frame_count * tc->ts_unit;
237 ret = ff_filter_frame(outlink, frame);236 ret = ff_filter_frame(outlink, frame);
238 }237 }
239 av_frame_free(&inpicref);238 av_frame_free(&inpicref);

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t