|
|
|
@@ -63,7 +63,6 @@ typedef struct MovieContext { |
|
|
|
AVFormatContext *format_ctx; |
|
|
|
int eof; |
|
|
|
AVPacket pkt, pkt0; |
|
|
|
AVFrame *frame; ///< video frame to store the decoded images in |
|
|
|
|
|
|
|
int max_stream_index; /**< max stream # actually used for output */ |
|
|
|
MovieStream *st; /**< array of all streams, one per output */ |
|
|
|
@@ -325,7 +324,6 @@ static av_cold void movie_uninit(AVFilterContext *ctx) |
|
|
|
} |
|
|
|
av_freep(&movie->st); |
|
|
|
av_freep(&movie->out_index); |
|
|
|
av_frame_free(&movie->frame); |
|
|
|
if (movie->format_ctx) |
|
|
|
avformat_close_input(&movie->format_ctx); |
|
|
|
} |
|
|
|
@@ -453,6 +451,7 @@ static int movie_push_frame(AVFilterContext *ctx, unsigned out_id) |
|
|
|
MovieStream *st; |
|
|
|
int ret, got_frame = 0, pkt_out_id; |
|
|
|
AVFilterLink *outlink; |
|
|
|
AVFrame *frame; |
|
|
|
|
|
|
|
if (!pkt->size) { |
|
|
|
if (movie->eof) { |
|
|
|
@@ -495,17 +494,17 @@ static int movie_push_frame(AVFilterContext *ctx, unsigned out_id) |
|
|
|
st = &movie->st[pkt_out_id]; |
|
|
|
outlink = ctx->outputs[pkt_out_id]; |
|
|
|
|
|
|
|
movie->frame = av_frame_alloc(); |
|
|
|
if (!movie->frame) |
|
|
|
frame = av_frame_alloc(); |
|
|
|
if (!frame) |
|
|
|
return AVERROR(ENOMEM); |
|
|
|
|
|
|
|
frame_type = st->st->codec->codec_type; |
|
|
|
switch (frame_type) { |
|
|
|
case AVMEDIA_TYPE_VIDEO: |
|
|
|
ret = avcodec_decode_video2(st->st->codec, movie->frame, &got_frame, pkt); |
|
|
|
ret = avcodec_decode_video2(st->st->codec, frame, &got_frame, pkt); |
|
|
|
break; |
|
|
|
case AVMEDIA_TYPE_AUDIO: |
|
|
|
ret = avcodec_decode_audio4(st->st->codec, movie->frame, &got_frame, pkt); |
|
|
|
ret = avcodec_decode_audio4(st->st->codec, frame, &got_frame, pkt); |
|
|
|
break; |
|
|
|
default: |
|
|
|
ret = AVERROR(ENOSYS); |
|
|
|
@@ -513,7 +512,7 @@ static int movie_push_frame(AVFilterContext *ctx, unsigned out_id) |
|
|
|
} |
|
|
|
if (ret < 0) { |
|
|
|
av_log(ctx, AV_LOG_WARNING, "Decode error: %s\n", av_err2str(ret)); |
|
|
|
av_frame_free(&movie->frame); |
|
|
|
av_frame_free(&frame); |
|
|
|
av_free_packet(&movie->pkt0); |
|
|
|
movie->pkt.size = 0; |
|
|
|
movie->pkt.data = NULL; |
|
|
|
@@ -532,26 +531,25 @@ static int movie_push_frame(AVFilterContext *ctx, unsigned out_id) |
|
|
|
if (!got_frame) { |
|
|
|
if (!ret) |
|
|
|
st->done = 1; |
|
|
|
av_frame_free(&movie->frame); |
|
|
|
av_frame_free(&frame); |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
movie->frame->pts = av_frame_get_best_effort_timestamp(movie->frame); |
|
|
|
frame->pts = av_frame_get_best_effort_timestamp(frame); |
|
|
|
av_dlog(ctx, "movie_push_frame(): file:'%s' %s\n", movie->file_name, |
|
|
|
describe_frame_to_str((char[1024]){0}, 1024, movie->frame, frame_type, outlink)); |
|
|
|
describe_frame_to_str((char[1024]){0}, 1024, frame, frame_type, outlink)); |
|
|
|
|
|
|
|
if (st->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) { |
|
|
|
if (movie->frame->format != outlink->format) { |
|
|
|
if (frame->format != outlink->format) { |
|
|
|
av_log(ctx, AV_LOG_ERROR, "Format changed %s -> %s, discarding frame\n", |
|
|
|
av_get_pix_fmt_name(outlink->format), |
|
|
|
av_get_pix_fmt_name(movie->frame->format) |
|
|
|
av_get_pix_fmt_name(frame->format) |
|
|
|
); |
|
|
|
av_frame_free(&movie->frame); |
|
|
|
av_frame_free(&frame); |
|
|
|
return 0; |
|
|
|
} |
|
|
|
} |
|
|
|
ret = ff_filter_frame(outlink, movie->frame); |
|
|
|
movie->frame = NULL; |
|
|
|
ret = ff_filter_frame(outlink, frame); |
|
|
|
|
|
|
|
if (ret < 0) |
|
|
|
return ret; |
|
|
|
|