From patchwork Fri Feb 10 12:35:35 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: wm4 X-Patchwork-Id: 2477 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.103.89.21 with SMTP id n21csp473834vsb; Fri, 10 Feb 2017 04:36:21 -0800 (PST) X-Received: by 10.223.161.130 with SMTP id u2mr8719191wru.127.1486730181588; Fri, 10 Feb 2017 04:36:21 -0800 (PST) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id p9si1988607wrp.181.2017.02.10.04.36.20; Fri, 10 Feb 2017 04:36:21 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@googlemail.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=googlemail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 30CA0689DCD; Fri, 10 Feb 2017 14:35:55 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr0-f194.google.com (mail-wr0-f194.google.com [209.85.128.194]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 17286689DA6 for ; Fri, 10 Feb 2017 14:35:49 +0200 (EET) Received: by mail-wr0-f194.google.com with SMTP id 89so14986066wrr.1 for ; Fri, 10 Feb 2017 04:35:53 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlemail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=bz9OXuEWJFyF36mYXpw8Z2cQk2AYYnCcgIf/vRmp53U=; b=tXYnMlP28Fbweykq9ryBG8zcLtYfSHqrdY82Xw+Yp+qv9eNRknaft6zcVPFyvlIXtm 9HdXbGCtr95sSKcDkbcqwQuwgp+wWNRbGILasJt7LfKr0yfFjNyOi4uWoZ299IhsbLmn I1xPJo3qZkNCCJwFvFiXYSPPzKa0HHdMyfb03VLiZH9LhlfsCQxgZcur4ORHwyKvAda6 tIiARqBd7VFAUalHJ74zZfvu3Gy11opsLX35KtXesliCVK5eysMA+3GgpKIEzsbrWMAd +uF+mRTZ1AAliPFwDlzE8cuyikEfU3/CuQ2Y/qWR0moFFipdhl8G/+5lB1wPaxflxTkS kUbQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=bz9OXuEWJFyF36mYXpw8Z2cQk2AYYnCcgIf/vRmp53U=; b=IN3Tqnqe/tmCH4oLs2nvbJsCBVzxNtcxJ+46qriYSUejefgcoCP6alCMZaX1HQdn71 S/8VeU5Wqg7pVQxa0nPT2L4cPZFCQVl5sGH4CKkfFgTtDEzKy5Qrrok/az150pshA1/b caTeG3x3pj0nvo8vuEF9QZz0U7OPBsC4PxUcyrp8ZSDuLxNTmE020qcQk8xPwTDAZG22 4LV4cE3K4EfdYk2zun9l9K3bUnBvYRHPlYDlWnyN/N1jnOWtTemVvOZNLbK8Q2aDfWwm oDoi8i2wj5jet78owiWC+uQKRxAwUe1FbQceBqWx7OFOXabKPpm5qAdJf6bABz0Pc7w6 sZCg== X-Gm-Message-State: AMke39mbpxznkLjrqZLsOuvDr0W3USNIchfVCWLCXgklbf7J8VdxxHmMsTU/1Hf5U26RFw== X-Received: by 10.223.136.50 with SMTP id d47mr8735270wrd.167.1486730152108; Fri, 10 Feb 2017 04:35:52 -0800 (PST) Received: from localhost.localdomain (p4FF029FA.dip0.t-ipconnect.de. [79.240.41.250]) by smtp.googlemail.com with ESMTPSA id s18sm1413656wmb.18.2017.02.10.04.35.48 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 10 Feb 2017 04:35:51 -0800 (PST) From: wm4 To: ffmpeg-devel@ffmpeg.org Date: Fri, 10 Feb 2017 13:35:35 +0100 Message-Id: <20170210123541.32375-4-nfxjfg@googlemail.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20170210123541.32375-1-nfxjfg@googlemail.com> References: <20170210123541.32375-1-nfxjfg@googlemail.com> Subject: [FFmpeg-devel] [PATCH 3/9] ffmpeg: init filtergraphs only after we have a frame on each input X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Cc: wm4 , Anton Khirnov MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" From: Anton Khirnov This makes sure the actual stream parameters are used, which is important mainly for hardware decoding+filtering cases, which would previously require various weird workarounds to handle the fact that a fake software graph has to be constructed, but never used. This should also improve behaviour in rare cases where avformat_find_stream_info() does not provide accurate information. This merges Libav commit a3a0230. It was previously skipped. The vp8-size-change gives different result, because now the size of the first frame is used. libavformat reported the size of the largest frame for some reason. The exr tests now use the sample aspect ratio of the first frame. For some reason libavformat determines 0/1 as aspect ratio, while the decoder returns the correct one. The ffm and mxf tests change the field_order values. I'm assuming another libavformat/decoding mismatch. Signed-off-by: wm4 --- ffmpeg.c | 284 ++++++++++++--------- ffmpeg.h | 15 +- ffmpeg_cuvid.c | 1 - ffmpeg_filter.c | 48 ++-- ffmpeg_opt.c | 44 ---- ffmpeg_qsv.c | 82 ------ .../fate/exr-rgb-scanline-pxr24-half-uint32-13x9 | 2 +- .../fate/exr-rgba-scanline-float-half-b44-12x8-l1 | 2 +- .../fate/exr-rgba-scanline-float-half-b44-12x8-l2 | 2 +- .../fate/exr-rgba-scanline-float-half-b44-13x9-l1 | 2 +- .../fate/exr-rgba-scanline-float-half-b44-13x9-l2 | 2 +- .../fate/exr-rgba-scanline-float-half-b44a-12x8-l1 | 2 +- .../fate/exr-rgba-scanline-float-half-b44a-12x8-l2 | 2 +- .../fate/exr-rgba-scanline-float-half-b44a-13x9-l1 | 2 +- .../fate/exr-rgba-scanline-float-half-b44a-13x9-l2 | 2 +- tests/ref/fate/vp8-size-change | 62 ++--- tests/ref/lavf/ffm | 2 +- tests/ref/lavf/mxf | 6 +- 18 files changed, 225 insertions(+), 337 deletions(-) diff --git a/ffmpeg.c b/ffmpeg.c index 8b829beb34..a3d36a76a7 100644 --- a/ffmpeg.c +++ b/ffmpeg.c @@ -472,6 +472,13 @@ static void ffmpeg_cleanup(int ret) FilterGraph *fg = filtergraphs[i]; avfilter_graph_free(&fg->graph); for (j = 0; j < fg->nb_inputs; j++) { + while (av_fifo_size(fg->inputs[j]->frame_queue)) { + AVFrame *frame; + av_fifo_generic_read(fg->inputs[j]->frame_queue, &frame, + sizeof(frame), NULL); + av_frame_free(&frame); + } + av_fifo_free(fg->inputs[j]->frame_queue); av_buffer_unref(&fg->inputs[j]->hw_frames_ctx); av_freep(&fg->inputs[j]->name); av_freep(&fg->inputs[j]); @@ -1377,6 +1384,8 @@ static void do_video_stats(OutputStream *ost, int frame_size) } } +static int init_output_stream(OutputStream *ost, char *error, int error_len); + static void finish_output_stream(OutputStream *ost) { OutputFile *of = output_files[ost->file_index]; @@ -1409,10 +1418,20 @@ static int reap_filters(int flush) AVCodecContext *enc = ost->enc_ctx; int ret = 0; - if (!ost->filter) + if (!ost->filter || !ost->filter->graph->graph) continue; filter = ost->filter->filter; + if (!ost->initialized) { + char error[1024]; + ret = init_output_stream(ost, error, sizeof(error)); + if (ret < 0) { + av_log(NULL, AV_LOG_ERROR, "Error initializing output stream %d:%d -- %s\n", + ost->file_index, ost->index, error); + exit_program(1); + } + } + if (!ost->filtered_frame && !(ost->filtered_frame = av_frame_alloc())) { return AVERROR(ENOMEM); } @@ -2044,6 +2063,102 @@ static void check_decode_result(InputStream *ist, int *got_output, int ret) } } +// Filters can be configured only if the formats of all inputs are known. +static int ifilter_has_all_input_formats(FilterGraph *fg) +{ + int i; + for (i = 0; i < fg->nb_inputs; i++) { + if (fg->inputs[i]->format < 0 && (fg->inputs[i]->type == AVMEDIA_TYPE_AUDIO || + fg->inputs[i]->type == AVMEDIA_TYPE_VIDEO)) + return 0; + } + return 1; +} + +static int ifilter_send_frame(InputFilter *ifilter, AVFrame *frame) +{ + FilterGraph *fg = ifilter->graph; + int need_reinit, ret, i; + + /* determine if the parameters for this input changed */ + need_reinit = ifilter->format != frame->format; + if (!!ifilter->hw_frames_ctx != !!frame->hw_frames_ctx || + (ifilter->hw_frames_ctx && ifilter->hw_frames_ctx->data != frame->hw_frames_ctx->data)) + need_reinit = 1; + + switch (ifilter->ist->st->codecpar->codec_type) { + case AVMEDIA_TYPE_AUDIO: + need_reinit |= ifilter->sample_rate != frame->sample_rate || + ifilter->channels != frame->channels || + ifilter->channel_layout != frame->channel_layout; + break; + case AVMEDIA_TYPE_VIDEO: + need_reinit |= ifilter->width != frame->width || + ifilter->height != frame->height; + break; + } + + if (need_reinit) { + ret = ifilter_parameters_from_frame(ifilter, frame); + if (ret < 0) + return ret; + } + + /* (re)init the graph if possible, otherwise buffer the frame and return */ + if (need_reinit || !fg->graph) { + for (i = 0; i < fg->nb_inputs; i++) { + if (!ifilter_has_all_input_formats(fg)) { + AVFrame *tmp = av_frame_clone(frame); + if (!tmp) + return AVERROR(ENOMEM); + av_frame_unref(frame); + + if (!av_fifo_space(ifilter->frame_queue)) { + ret = av_fifo_realloc2(ifilter->frame_queue, 2 * av_fifo_size(ifilter->frame_queue)); + if (ret < 0) + return ret; + } + av_fifo_generic_write(ifilter->frame_queue, &tmp, sizeof(tmp), NULL); + return 0; + } + } + + ret = reap_filters(1); + if (ret < 0 && ret != AVERROR_EOF) { + char errbuf[128]; + av_strerror(ret, errbuf, sizeof(errbuf)); + + av_log(NULL, AV_LOG_ERROR, "Error while filtering: %s\n", errbuf); + return ret; + } + + ret = configure_filtergraph(fg); + if (ret < 0) { + av_log(NULL, AV_LOG_ERROR, "Error reinitializing filters!\n"); + return ret; + } + + for (i = 0; i < fg->nb_inputs; i++) { + while (av_fifo_size(fg->inputs[i]->frame_queue)) { + AVFrame *tmp; + av_fifo_generic_read(fg->inputs[i]->frame_queue, &tmp, sizeof(tmp), NULL); + ret = av_buffersrc_add_frame(fg->inputs[i]->filter, tmp); + av_frame_free(&tmp); + if (ret < 0) + return ret; + } + } + } + + ret = av_buffersrc_add_frame(ifilter->filter, frame); + if (ret < 0) { + av_log(NULL, AV_LOG_ERROR, "Error while filtering\n"); + return ret; + } + + return 0; +} + // This does not quite work like avcodec_decode_audio4/avcodec_decode_video2. // There is the following difference: if you got a frame, you must call // it again with pkt=NULL. pkt==NULL is treated differently from pkt.size==0 @@ -2085,8 +2200,7 @@ static int send_frame_to_filters(InputStream *ist, AVFrame *decoded_frame) break; } else f = decoded_frame; - ret = av_buffersrc_add_frame_flags(ist->filters[i]->filter, f, - AV_BUFFERSRC_FLAG_PUSH); + ret = ifilter_send_frame(ist->filters[i], f); if (ret == AVERROR_EOF) ret = 0; /* ignore */ if (ret < 0) { @@ -2102,7 +2216,7 @@ static int decode_audio(InputStream *ist, AVPacket *pkt, int *got_output) { AVFrame *decoded_frame; AVCodecContext *avctx = ist->dec_ctx; - int i, ret, err = 0, resample_changed; + int ret, err = 0; AVRational decoded_frame_tb; if (!ist->decoded_frame && !(ist->decoded_frame = av_frame_alloc())) @@ -2138,59 +2252,6 @@ static int decode_audio(InputStream *ist, AVPacket *pkt, int *got_output) avctx->sample_rate; #endif - resample_changed = ist->resample_sample_fmt != decoded_frame->format || - ist->resample_channels != avctx->channels || - ist->resample_channel_layout != decoded_frame->channel_layout || - ist->resample_sample_rate != decoded_frame->sample_rate; - if (resample_changed) { - char layout1[64], layout2[64]; - - if (!guess_input_channel_layout(ist)) { - av_log(NULL, AV_LOG_FATAL, "Unable to find default channel " - "layout for Input Stream #%d.%d\n", ist->file_index, - ist->st->index); - exit_program(1); - } - decoded_frame->channel_layout = avctx->channel_layout; - - av_get_channel_layout_string(layout1, sizeof(layout1), ist->resample_channels, - ist->resample_channel_layout); - av_get_channel_layout_string(layout2, sizeof(layout2), avctx->channels, - decoded_frame->channel_layout); - - av_log(NULL, AV_LOG_INFO, - "Input stream #%d:%d frame changed from rate:%d fmt:%s ch:%d chl:%s to rate:%d fmt:%s ch:%d chl:%s\n", - ist->file_index, ist->st->index, - ist->resample_sample_rate, av_get_sample_fmt_name(ist->resample_sample_fmt), - ist->resample_channels, layout1, - decoded_frame->sample_rate, av_get_sample_fmt_name(decoded_frame->format), - avctx->channels, layout2); - - ist->resample_sample_fmt = decoded_frame->format; - ist->resample_sample_rate = decoded_frame->sample_rate; - ist->resample_channel_layout = decoded_frame->channel_layout; - ist->resample_channels = avctx->channels; - - for (i = 0; i < ist->nb_filters; i++) { - err = ifilter_parameters_from_frame(ist->filters[i], decoded_frame); - if (err < 0) { - av_log(NULL, AV_LOG_ERROR, - "Error reconfiguring input stream %d:%d filter %d\n", - ist->file_index, ist->st->index, i); - goto fail; - } - } - - for (i = 0; i < nb_filtergraphs; i++) - if (ist_in_filtergraph(filtergraphs[i], ist)) { - FilterGraph *fg = filtergraphs[i]; - if (configure_filtergraph(fg) < 0) { - av_log(NULL, AV_LOG_FATAL, "Error reinitializing filters!\n"); - exit_program(1); - } - } - } - if (decoded_frame->pts != AV_NOPTS_VALUE) { decoded_frame_tb = ist->st->time_base; } else if (pkt && pkt->pts != AV_NOPTS_VALUE) { @@ -2206,9 +2267,7 @@ static int decode_audio(InputStream *ist, AVPacket *pkt, int *got_output) (AVRational){1, avctx->sample_rate}); ist->nb_samples = decoded_frame->nb_samples; err = send_frame_to_filters(ist, decoded_frame); - decoded_frame->pts = AV_NOPTS_VALUE; -fail: av_frame_unref(ist->filter_frame); av_frame_unref(decoded_frame); return err < 0 ? err : ret; @@ -2217,7 +2276,7 @@ fail: static int decode_video(InputStream *ist, AVPacket *pkt, int *got_output, int eof) { AVFrame *decoded_frame; - int i, ret = 0, err = 0, resample_changed; + int i, ret = 0, err = 0; int64_t best_effort_timestamp; int64_t dts = AV_NOPTS_VALUE; AVPacket avpkt; @@ -2332,39 +2391,6 @@ static int decode_video(InputStream *ist, AVPacket *pkt, int *got_output, int eo if (ist->st->sample_aspect_ratio.num) decoded_frame->sample_aspect_ratio = ist->st->sample_aspect_ratio; - resample_changed = ist->resample_width != decoded_frame->width || - ist->resample_height != decoded_frame->height || - ist->resample_pix_fmt != decoded_frame->format; - if (resample_changed) { - av_log(NULL, AV_LOG_INFO, - "Input stream #%d:%d frame changed from size:%dx%d fmt:%s to size:%dx%d fmt:%s\n", - ist->file_index, ist->st->index, - ist->resample_width, ist->resample_height, av_get_pix_fmt_name(ist->resample_pix_fmt), - decoded_frame->width, decoded_frame->height, av_get_pix_fmt_name(decoded_frame->format)); - - ist->resample_width = decoded_frame->width; - ist->resample_height = decoded_frame->height; - ist->resample_pix_fmt = decoded_frame->format; - - for (i = 0; i < ist->nb_filters; i++) { - err = ifilter_parameters_from_frame(ist->filters[i], decoded_frame); - if (err < 0) { - av_log(NULL, AV_LOG_ERROR, - "Error reconfiguring input stream %d:%d filter %d\n", - ist->file_index, ist->st->index, i); - goto fail; - } - } - - for (i = 0; i < nb_filtergraphs; i++) { - if (ist_in_filtergraph(filtergraphs[i], ist) && ist->reinit_filters && - configure_filtergraph(filtergraphs[i]) < 0) { - av_log(NULL, AV_LOG_FATAL, "Error reinitializing filters!\n"); - exit_program(1); - } - } - } - err = send_frame_to_filters(ist, decoded_frame); fail: @@ -2434,11 +2460,18 @@ out: static int send_filter_eof(InputStream *ist) { - int i, ret; + int i, j, ret; for (i = 0; i < ist->nb_filters; i++) { - ret = av_buffersrc_add_frame(ist->filters[i]->filter, NULL); - if (ret < 0) - return ret; + if (ist->filters[i]->filter) { + ret = av_buffersrc_add_frame(ist->filters[i]->filter, NULL); + if (ret < 0) + return ret; + } else { + // the filtergraph was never configured + FilterGraph *fg = ist->filters[i]->graph; + for (j = 0; j < fg->nb_outputs; j++) + finish_output_stream(fg->outputs[j]->ost); + } } return 0; } @@ -2544,6 +2577,9 @@ static int process_input_packet(InputStream *ist, const AVPacket *pkt, int no_eo break; } + if (got_output) + ist->got_output = 1; + if (!got_output) break; @@ -2721,17 +2757,9 @@ static int get_buffer(AVCodecContext *s, AVFrame *frame, int flags) static int init_input_stream(int ist_index, char *error, int error_len) { - int i, ret; + int ret; InputStream *ist = input_streams[ist_index]; - for (i = 0; i < ist->nb_filters; i++) { - ret = ifilter_parameters_from_decoder(ist->filters[i], ist->dec_ctx); - if (ret < 0) { - av_log(NULL, AV_LOG_FATAL, "Error initializing filter input\n"); - return ret; - } - } - if (ist->decoding_needed) { AVCodec *codec = ist->dec; if (!codec) { @@ -3119,17 +3147,6 @@ static int init_output_stream_encode(OutputStream *ost) ost->st->disposition = AV_DISPOSITION_DEFAULT; } - if ((enc_ctx->codec_type == AVMEDIA_TYPE_VIDEO || - enc_ctx->codec_type == AVMEDIA_TYPE_AUDIO) && - filtergraph_is_simple(ost->filter->graph)) { - FilterGraph *fg = ost->filter->graph; - - if (configure_filtergraph(fg)) { - av_log(NULL, AV_LOG_FATAL, "Error opening filters!\n"); - exit_program(1); - } - } - if (enc_ctx->codec_type == AVMEDIA_TYPE_VIDEO) { if (!ost->frame_rate.num) ost->frame_rate = av_buffersink_get_frame_rate(ost->filter->filter); @@ -3469,10 +3486,6 @@ static int transcode_init(void) ost = output_streams[i]; if (!ost->stream_copy) { -#if CONFIG_LIBMFX - if (qsv_transcode_init(ost)) - exit_program(1); -#endif #if CONFIG_CUVID if (cuvid_transcode_init(ost)) @@ -3493,6 +3506,10 @@ static int transcode_init(void) /* open each encoder */ for (i = 0; i < nb_output_streams; i++) { + // skip streams fed from filtergraphs until we have a frame for them + if (output_streams[i]->filter) + continue; + ret = init_output_stream(output_streams[i], error, sizeof(error)); if (ret < 0) goto dump_format; @@ -4320,7 +4337,7 @@ static int transcode_from_filter(FilterGraph *graph, InputStream **best_ist) static int transcode_step(void) { OutputStream *ost; - InputStream *ist; + InputStream *ist = NULL; int ret; ost = choose_output(); @@ -4334,11 +4351,32 @@ static int transcode_step(void) return AVERROR_EOF; } - if (ost->filter) { + if (ost->filter && !ost->filter->graph->graph) { + if (ifilter_has_all_input_formats(ost->filter->graph)) { + ret = configure_filtergraph(ost->filter->graph); + if (ret < 0) { + av_log(NULL, AV_LOG_ERROR, "Error reinitializing filters!\n"); + return ret; + } + } + } + + if (ost->filter && ost->filter->graph->graph) { if ((ret = transcode_from_filter(ost->filter->graph, &ist)) < 0) return ret; if (!ist) return 0; + } else if (ost->filter) { + int i; + for (i = 0; i < ost->filter->graph->nb_inputs; i++) { + InputFilter *ifilter = ost->filter->graph->inputs[i]; + if (!ifilter->ist->got_output && !input_files[ifilter->ist->file_index]->eof_reached) { + ist = ifilter->ist; + break; + } + } + if (!ist) + return 0; } else { av_assert0(ost->source_index >= 0); ist = input_streams[ost->source_index]; diff --git a/ffmpeg.h b/ffmpeg.h index ca35ccc260..11ad15b04e 100644 --- a/ffmpeg.h +++ b/ffmpeg.h @@ -233,6 +233,9 @@ typedef struct InputFilter { struct InputStream *ist; struct FilterGraph *graph; uint8_t *name; + enum AVMediaType type; // AVMEDIA_TYPE_SUBTITLE for sub2video + + AVFifoBuffer *frame_queue; // parameters configured for this input int format; @@ -321,14 +324,6 @@ typedef struct InputStream { int guess_layout_max; int autorotate; - int resample_height; - int resample_width; - int resample_pix_fmt; - - int resample_sample_fmt; - int resample_sample_rate; - int resample_channels; - uint64_t resample_channel_layout; int fix_sub_duration; struct { /* previous decoded subtitle and related variables */ @@ -379,6 +374,8 @@ typedef struct InputStream { int64_t *dts_buffer; int nb_dts_buffer; + + int got_output; } InputStream; typedef struct InputFile { @@ -636,7 +633,6 @@ int init_simple_filtergraph(InputStream *ist, OutputStream *ost); int init_complex_filtergraph(FilterGraph *fg); int ifilter_parameters_from_frame(InputFilter *ifilter, const AVFrame *frame); -int ifilter_parameters_from_decoder(InputFilter *ifilter, const AVCodecContext *avctx); int ffmpeg_parse_options(int argc, char **argv); @@ -645,7 +641,6 @@ int dxva2_init(AVCodecContext *s); int vda_init(AVCodecContext *s); int videotoolbox_init(AVCodecContext *s); int qsv_init(AVCodecContext *s); -int qsv_transcode_init(OutputStream *ost); int vaapi_decode_init(AVCodecContext *avctx); int vaapi_device_init(const char *device); int cuvid_init(AVCodecContext *s); diff --git a/ffmpeg_cuvid.c b/ffmpeg_cuvid.c index baf6eee9f8..46540795d4 100644 --- a/ffmpeg_cuvid.c +++ b/ffmpeg_cuvid.c @@ -125,7 +125,6 @@ int cuvid_transcode_init(OutputStream *ost) } ist->hwaccel_ctx = ctx; - ist->resample_pix_fmt = AV_PIX_FMT_CUDA; ist->hwaccel_uninit = cuvid_uninit; /* This is a bit hacky, av_hwframe_ctx_init is called by the cuvid decoder diff --git a/ffmpeg_filter.c b/ffmpeg_filter.c index f13f523045..8490f4a455 100644 --- a/ffmpeg_filter.c +++ b/ffmpeg_filter.c @@ -217,6 +217,10 @@ int init_simple_filtergraph(InputStream *ist, OutputStream *ost) fg->inputs[0]->graph = fg; fg->inputs[0]->format = -1; + fg->inputs[0]->frame_queue = av_fifo_alloc(8 * sizeof(AVFrame*)); + if (!fg->inputs[0]->frame_queue) + exit_program(1); + GROW_ARRAY(ist->filters, ist->nb_filters); ist->filters[ist->nb_filters - 1] = fg->inputs[0]; @@ -295,6 +299,11 @@ static void init_input_filter(FilterGraph *fg, AVFilterInOut *in) fg->inputs[fg->nb_inputs - 1]->ist = ist; fg->inputs[fg->nb_inputs - 1]->graph = fg; fg->inputs[fg->nb_inputs - 1]->format = -1; + fg->inputs[fg->nb_inputs - 1]->type = ist->st->codecpar->codec_type; + + fg->inputs[fg->nb_inputs - 1]->frame_queue = av_fifo_alloc(8 * sizeof(AVFrame*)); + if (!fg->inputs[fg->nb_inputs - 1]->frame_queue) + exit_program(1); GROW_ARRAY(ist->filters, ist->nb_filters); ist->filters[ist->nb_filters - 1] = fg->inputs[fg->nb_inputs - 1]; @@ -691,12 +700,15 @@ static int sub2video_prepare(InputStream *ist, InputFilter *ifilter) } av_log(avf, AV_LOG_INFO, "sub2video: using %dx%d canvas\n", w, h); } - ist->sub2video.w = ist->resample_width = ifilter->width = w; - ist->sub2video.h = ist->resample_height = ifilter->height = h; + ist->sub2video.w = ifilter->width = w; + ist->sub2video.h = ifilter->height = h; + + ifilter->width = ist->dec_ctx->width ? ist->dec_ctx->width : ist->sub2video.w; + ifilter->height = ist->dec_ctx->height ? ist->dec_ctx->height : ist->sub2video.h; /* rectangles are AV_PIX_FMT_PAL8, but we have no guarantee that the palettes for all rectangles are identical or compatible */ - ist->resample_pix_fmt = ifilter->format = AV_PIX_FMT_RGB32; + ifilter->format = AV_PIX_FMT_RGB32; ist->sub2video.frame = av_frame_alloc(); if (!ist->sub2video.frame) @@ -1133,36 +1145,6 @@ int ifilter_parameters_from_frame(InputFilter *ifilter, const AVFrame *frame) return 0; } -int ifilter_parameters_from_decoder(InputFilter *ifilter, const AVCodecContext *avctx) -{ - av_buffer_unref(&ifilter->hw_frames_ctx); - - if (avctx->codec_type == AVMEDIA_TYPE_VIDEO) - ifilter->format = avctx->pix_fmt; - else - ifilter->format = avctx->sample_fmt; - - ifilter->width = avctx->width; - ifilter->height = avctx->height; - if (ifilter->ist && ifilter->ist->st && ifilter->ist->st->sample_aspect_ratio.num) - ifilter->sample_aspect_ratio = ifilter->ist->st->sample_aspect_ratio; - else - ifilter->sample_aspect_ratio = avctx->sample_aspect_ratio; - - ifilter->sample_rate = avctx->sample_rate; - ifilter->channels = avctx->channels; - ifilter->channel_layout = avctx->channel_layout; - - if (ifilter->ist && ifilter->ist->hw_frames_ctx) { - ifilter->format = ifilter->ist->resample_pix_fmt; - ifilter->hw_frames_ctx = av_buffer_ref(ifilter->ist->hw_frames_ctx); - if (!ifilter->hw_frames_ctx) - return AVERROR(ENOMEM); - } - - return 0; -} - int ist_in_filtergraph(FilterGraph *fg, InputStream *ist) { int i; diff --git a/ffmpeg_opt.c b/ffmpeg_opt.c index 6a47d32b53..e2c0176e14 100644 --- a/ffmpeg_opt.c +++ b/ffmpeg_opt.c @@ -736,10 +736,6 @@ static void add_input_streams(OptionsContext *o, AVFormatContext *ic) // avformat_find_stream_info() doesn't set this for us anymore. ist->dec_ctx->framerate = st->avg_frame_rate; - ist->resample_height = ist->dec_ctx->height; - ist->resample_width = ist->dec_ctx->width; - ist->resample_pix_fmt = ist->dec_ctx->pix_fmt; - MATCH_PER_STREAM_OPT(frame_rates, str, framerate, ic, st); if (framerate && av_parse_video_rate(&ist->framerate, framerate) < 0) { @@ -804,12 +800,6 @@ static void add_input_streams(OptionsContext *o, AVFormatContext *ic) ist->guess_layout_max = INT_MAX; MATCH_PER_STREAM_OPT(guess_layout_max, i, ist->guess_layout_max, ic, st); guess_input_channel_layout(ist); - - ist->resample_sample_fmt = ist->dec_ctx->sample_fmt; - ist->resample_sample_rate = ist->dec_ctx->sample_rate; - ist->resample_channels = ist->dec_ctx->channels; - ist->resample_channel_layout = ist->dec_ctx->channel_layout; - break; case AVMEDIA_TYPE_DATA: case AVMEDIA_TYPE_SUBTITLE: { @@ -2021,33 +2011,6 @@ static int init_complex_filters(void) return 0; } -static int configure_complex_filters(void) -{ - int i, j, ret = 0; - - for (i = 0; i < nb_filtergraphs; i++) { - FilterGraph *fg = filtergraphs[i]; - - if (filtergraph_is_simple(fg)) - continue; - - for (j = 0; j < fg->nb_inputs; j++) { - ret = ifilter_parameters_from_decoder(fg->inputs[j], - fg->inputs[j]->ist->dec_ctx); - if (ret < 0) { - av_log(NULL, AV_LOG_ERROR, - "Error initializing filtergraph %d input %d\n", i, j); - return ret; - } - } - - ret = configure_filtergraph(filtergraphs[i]); - if (ret < 0) - return ret; - } - return 0; -} - static int open_output_file(OptionsContext *o, const char *filename) { AVFormatContext *oc; @@ -3291,13 +3254,6 @@ int ffmpeg_parse_options(int argc, char **argv) goto fail; } - /* configure the complex filtergraphs */ - ret = configure_complex_filters(); - if (ret < 0) { - av_log(NULL, AV_LOG_FATAL, "Error configuring complex filters.\n"); - goto fail; - } - fail: uninit_parse_context(&octx); if (ret < 0) { diff --git a/ffmpeg_qsv.c b/ffmpeg_qsv.c index 86824b60f2..7442750029 100644 --- a/ffmpeg_qsv.c +++ b/ffmpeg_qsv.c @@ -107,85 +107,3 @@ int qsv_init(AVCodecContext *s) return 0; } - -int qsv_transcode_init(OutputStream *ost) -{ - InputStream *ist; - const enum AVPixelFormat *pix_fmt; - - int err, i; - AVBufferRef *encode_frames_ref = NULL; - AVHWFramesContext *encode_frames; - AVQSVFramesContext *qsv_frames; - - /* check if the encoder supports QSV */ - if (!ost->enc->pix_fmts) - return 0; - for (pix_fmt = ost->enc->pix_fmts; *pix_fmt != AV_PIX_FMT_NONE; pix_fmt++) - if (*pix_fmt == AV_PIX_FMT_QSV) - break; - if (*pix_fmt == AV_PIX_FMT_NONE) - return 0; - - if (strcmp(ost->avfilter, "null") || ost->source_index < 0) - return 0; - - /* check if the decoder supports QSV and the output only goes to this stream */ - ist = input_streams[ost->source_index]; - if (ist->hwaccel_id != HWACCEL_QSV || !ist->dec || !ist->dec->pix_fmts) - return 0; - for (pix_fmt = ist->dec->pix_fmts; *pix_fmt != AV_PIX_FMT_NONE; pix_fmt++) - if (*pix_fmt == AV_PIX_FMT_QSV) - break; - if (*pix_fmt == AV_PIX_FMT_NONE) - return 0; - - for (i = 0; i < nb_output_streams; i++) - if (output_streams[i] != ost && - output_streams[i]->source_index == ost->source_index) - return 0; - - av_log(NULL, AV_LOG_VERBOSE, "Setting up QSV transcoding\n"); - - if (!hw_device_ctx) { - err = qsv_device_init(ist); - if (err < 0) - goto fail; - } - - // This creates a dummy hw_frames_ctx for the encoder to be - // suitably initialised. It only contains one real frame, so - // hopefully doesn't waste too much memory. - - encode_frames_ref = av_hwframe_ctx_alloc(hw_device_ctx); - if (!encode_frames_ref) { - err = AVERROR(ENOMEM); - goto fail; - } - encode_frames = (AVHWFramesContext*)encode_frames_ref->data; - qsv_frames = encode_frames->hwctx; - - encode_frames->width = FFALIGN(ist->resample_width, 32); - encode_frames->height = FFALIGN(ist->resample_height, 32); - encode_frames->format = AV_PIX_FMT_QSV; - encode_frames->sw_format = AV_PIX_FMT_NV12; - encode_frames->initial_pool_size = 1; - - qsv_frames->frame_type = MFX_MEMTYPE_VIDEO_MEMORY_DECODER_TARGET; - - err = av_hwframe_ctx_init(encode_frames_ref); - if (err < 0) - goto fail; - - ist->dec_ctx->pix_fmt = AV_PIX_FMT_QSV; - ist->resample_pix_fmt = AV_PIX_FMT_QSV; - - ost->enc_ctx->pix_fmt = AV_PIX_FMT_QSV; - ost->enc_ctx->hw_frames_ctx = encode_frames_ref; - - return 0; - -fail: - av_buffer_unref(&encode_frames_ref); - return err; -} diff --git a/tests/ref/fate/exr-rgb-scanline-pxr24-half-uint32-13x9 b/tests/ref/fate/exr-rgb-scanline-pxr24-half-uint32-13x9 index 4a54c336e3..e2aa9efb9f 100644 --- a/tests/ref/fate/exr-rgb-scanline-pxr24-half-uint32-13x9 +++ b/tests/ref/fate/exr-rgb-scanline-pxr24-half-uint32-13x9 @@ -2,5 +2,5 @@ #media_type 0: video #codec_id 0: rawvideo #dimensions 0: 13x9 -#sar 0: 0/1 +#sar 0: 9/10 0, 0, 0, 1, 936, 0x7b44246e diff --git a/tests/ref/fate/exr-rgba-scanline-float-half-b44-12x8-l1 b/tests/ref/fate/exr-rgba-scanline-float-half-b44-12x8-l1 index c84d388fff..cd25f618f4 100644 --- a/tests/ref/fate/exr-rgba-scanline-float-half-b44-12x8-l1 +++ b/tests/ref/fate/exr-rgba-scanline-float-half-b44-12x8-l1 @@ -2,5 +2,5 @@ #media_type 0: video #codec_id 0: rawvideo #dimensions 0: 12x8 -#sar 0: 0/1 +#sar 0: 9/10 0, 0, 0, 1, 768, 0x1de5c7f1 diff --git a/tests/ref/fate/exr-rgba-scanline-float-half-b44-12x8-l2 b/tests/ref/fate/exr-rgba-scanline-float-half-b44-12x8-l2 index 1dd42d9175..ecfba85e83 100644 --- a/tests/ref/fate/exr-rgba-scanline-float-half-b44-12x8-l2 +++ b/tests/ref/fate/exr-rgba-scanline-float-half-b44-12x8-l2 @@ -2,5 +2,5 @@ #media_type 0: video #codec_id 0: rawvideo #dimensions 0: 12x8 -#sar 0: 0/1 +#sar 0: 9/10 0, 0, 0, 1, 768, 0xe08ca6d3 diff --git a/tests/ref/fate/exr-rgba-scanline-float-half-b44-13x9-l1 b/tests/ref/fate/exr-rgba-scanline-float-half-b44-13x9-l1 index 595c721d50..3e82e2aaa4 100644 --- a/tests/ref/fate/exr-rgba-scanline-float-half-b44-13x9-l1 +++ b/tests/ref/fate/exr-rgba-scanline-float-half-b44-13x9-l1 @@ -2,5 +2,5 @@ #media_type 0: video #codec_id 0: rawvideo #dimensions 0: 13x9 -#sar 0: 0/1 +#sar 0: 9/10 0, 0, 0, 1, 936, 0xdcb42186 diff --git a/tests/ref/fate/exr-rgba-scanline-float-half-b44-13x9-l2 b/tests/ref/fate/exr-rgba-scanline-float-half-b44-13x9-l2 index 079d1d877f..f237d17d3f 100644 --- a/tests/ref/fate/exr-rgba-scanline-float-half-b44-13x9-l2 +++ b/tests/ref/fate/exr-rgba-scanline-float-half-b44-13x9-l2 @@ -2,5 +2,5 @@ #media_type 0: video #codec_id 0: rawvideo #dimensions 0: 13x9 -#sar 0: 0/1 +#sar 0: 9/10 0, 0, 0, 1, 936, 0x7f710bf5 diff --git a/tests/ref/fate/exr-rgba-scanline-float-half-b44a-12x8-l1 b/tests/ref/fate/exr-rgba-scanline-float-half-b44a-12x8-l1 index 6d202af808..43313e3712 100644 --- a/tests/ref/fate/exr-rgba-scanline-float-half-b44a-12x8-l1 +++ b/tests/ref/fate/exr-rgba-scanline-float-half-b44a-12x8-l1 @@ -2,5 +2,5 @@ #media_type 0: video #codec_id 0: rawvideo #dimensions 0: 12x8 -#sar 0: 0/1 +#sar 0: 9/10 0, 0, 0, 1, 768, 0xe200c160 diff --git a/tests/ref/fate/exr-rgba-scanline-float-half-b44a-12x8-l2 b/tests/ref/fate/exr-rgba-scanline-float-half-b44a-12x8-l2 index 1dd42d9175..ecfba85e83 100644 --- a/tests/ref/fate/exr-rgba-scanline-float-half-b44a-12x8-l2 +++ b/tests/ref/fate/exr-rgba-scanline-float-half-b44a-12x8-l2 @@ -2,5 +2,5 @@ #media_type 0: video #codec_id 0: rawvideo #dimensions 0: 12x8 -#sar 0: 0/1 +#sar 0: 9/10 0, 0, 0, 1, 768, 0xe08ca6d3 diff --git a/tests/ref/fate/exr-rgba-scanline-float-half-b44a-13x9-l1 b/tests/ref/fate/exr-rgba-scanline-float-half-b44a-13x9-l1 index 9fcf309368..e43c31ebd5 100644 --- a/tests/ref/fate/exr-rgba-scanline-float-half-b44a-13x9-l1 +++ b/tests/ref/fate/exr-rgba-scanline-float-half-b44a-13x9-l1 @@ -2,5 +2,5 @@ #media_type 0: video #codec_id 0: rawvideo #dimensions 0: 13x9 -#sar 0: 0/1 +#sar 0: 9/10 0, 0, 0, 1, 936, 0x911718ac diff --git a/tests/ref/fate/exr-rgba-scanline-float-half-b44a-13x9-l2 b/tests/ref/fate/exr-rgba-scanline-float-half-b44a-13x9-l2 index 079d1d877f..f237d17d3f 100644 --- a/tests/ref/fate/exr-rgba-scanline-float-half-b44a-13x9-l2 +++ b/tests/ref/fate/exr-rgba-scanline-float-half-b44a-13x9-l2 @@ -2,5 +2,5 @@ #media_type 0: video #codec_id 0: rawvideo #dimensions 0: 13x9 -#sar 0: 0/1 +#sar 0: 9/10 0, 0, 0, 1, 936, 0x7f710bf5 diff --git a/tests/ref/fate/vp8-size-change b/tests/ref/fate/vp8-size-change index 741b6d65fb..5105bc6f55 100644 --- a/tests/ref/fate/vp8-size-change +++ b/tests/ref/fate/vp8-size-change @@ -4,36 +4,36 @@ #tb 0: 1/30 #media_type 0: video #codec_id 0: rawvideo -#dimensions 0: 1920x1080 +#dimensions 0: 160x90 #sar 0: 1/1 #stream#, dts, pts, duration, size, hash -0, 0, 0, 1, 3110400, 7dde8cd136ab4b04a95d9856b941697e -0, 1, 1, 1, 3110400, aa885f78cb6374b5bfcc66a4fc57026f -0, 2, 2, 1, 3110400, b69b7b56f549a3f9b0a603940bac85ed -0, 3, 3, 1, 3110400, 20e2e0f0c89c58828b6a3b10d9e175e5 -0, 4, 4, 1, 3110400, 483997936e7d6bb849e64d50426ec689 -0, 5, 5, 1, 3110400, c85ef97a853ff594e2bfdf0a0a581dcc -0, 6, 6, 1, 3110400, c5e7b9ff4c25391793446da788cb83a9 -0, 7, 7, 1, 3110400, 63f93e89d24162e2f6328edbc6716b33 -0, 8, 8, 1, 3110400, 0e346ab4831ce8c69001153c72b7b827 -0, 9, 9, 1, 3110400, c526c21511d8bec2659d3d43d93734f2 -0, 10, 10, 1, 3110400, e95d01d5f9fb81a98bd34305c7ab30f8 -0, 11, 11, 1, 3110400, 177e75e7516e8746d31b43ea9d39e6b1 -0, 12, 12, 1, 3110400, 489d2bc0da93f118dc9a2697275697a7 -0, 13, 13, 1, 3110400, a2dc00d627350ff1ab302bcbad5ca5ac -0, 14, 14, 1, 3110400, 20ce143831b0189f763ee5bee9c51188 -0, 15, 15, 1, 3110400, 7822fd908bd81b521c23fa4a639caf9e -0, 16, 16, 1, 3110400, dabc4febbe09734126ac6f5a5180ba8c -0, 17, 17, 1, 3110400, ef88f0d6667feefac1471b065208e1c8 -0, 18, 18, 1, 3110400, 7c7fc665a6fd9e19af9358bbdc162a51 -0, 19, 19, 1, 3110400, f2bcf32f734f99506bdd0a0376badf82 -0, 20, 20, 1, 3110400, 06809c2d277fd3b3918ebb4b65c27661 -0, 21, 21, 1, 3110400, e403e9e86fa5d519f65c565b3add84b5 -0, 22, 22, 1, 3110400, d2b876730e12245cacb578307794349a -0, 23, 23, 1, 3110400, dfdfd8cb626a96138f6a2c1953dcf5ec -0, 24, 24, 1, 3110400, 0ac58c28575b804d9e63395653c3aef2 -0, 25, 25, 1, 3110400, 641f2a78e338c733ef159bd36ec7966f -0, 26, 26, 1, 3110400, 9402d455fa5bd556b85f479c42c3a4d2 -0, 27, 27, 1, 3110400, 0044d42b4048bc93112aa59789dbdc2d -0, 28, 28, 1, 3110400, 5d9e5c5ba35f6f452e5f31ccff9e819c -0, 29, 29, 1, 3110400, 307a55a94739b4cfdf41f7da7e5c0135 +0, 0, 0, 1, 21600, 5abd6c163522c7e882f7e9c369293bf9 +0, 1, 1, 1, 21600, 5c11d8cc9cc9102d0ef5afd1dc64aff1 +0, 2, 2, 1, 21600, cbeffa9ea9d682af77d3fd0fdf12c8c1 +0, 3, 3, 1, 21600, ea7cec515fcf8ccbc932d9e9b472cdc7 +0, 4, 4, 1, 21600, 23038b711dbac95ce710657b1fef5901 +0, 5, 5, 1, 21600, e0d6fb46bb5c0d939ee33af82b887668 +0, 6, 6, 1, 21600, 694518f14d3a2bd3c319bc0b098c78bb +0, 7, 7, 1, 21600, c1c7394bd4236afbc773af52ef7a10ea +0, 8, 8, 1, 21600, 4d8d3b2c9a637f963521585ea879357b +0, 9, 9, 1, 21600, b4444dc3cbf1b6cdd8047d3dcd497ffd +0, 10, 10, 1, 21600, 65e5d667ec9ceb636e21357f032ce800 +0, 11, 11, 1, 21600, fd9a4c67598051074387b640df7edaa9 +0, 12, 12, 1, 21600, 0e54e22d90f6296ae6989c83846272cd +0, 13, 13, 1, 21600, db4b1727450243b202bfec5ed6c73ae0 +0, 14, 14, 1, 21600, ab37a84be075ca42cc7351ff9fb1cb47 +0, 15, 15, 1, 21600, ae4d2d297e646bd8e05e76b457d9b576 +0, 16, 16, 1, 21600, e7cfd580e3c3d7c3f2f5136d1e548595 +0, 17, 17, 1, 21600, cbec09314a0b7ad53f4893eb474e1c65 +0, 18, 18, 1, 21600, e1fa89cd63c37496bc86f18694324d88 +0, 19, 19, 1, 21600, e9655b151253950313810228278ca104 +0, 20, 20, 1, 21600, 69ba31c0eff7bc93f4180173d8e64c60 +0, 21, 21, 1, 21600, 368a1f6a1172d7d56f695153b234a330 +0, 22, 22, 1, 21600, 6c298b196e16c64f7c2f407ba1242937 +0, 23, 23, 1, 21600, bf54474112ed5592c4d890e3313881a0 +0, 24, 24, 1, 21600, 945d49abedb0606b6a009c8b5d8face3 +0, 25, 25, 1, 21600, dd6ebef7b6f24619910de811918d3437 +0, 26, 26, 1, 21600, 7952346fc0f1eff3914e0d7646b3cf28 +0, 27, 27, 1, 21600, 26bd0d6b21e8a2df17af8d1446fba745 +0, 28, 28, 1, 21600, b0d91600416716d81c1f73ac141a0b62 +0, 29, 29, 1, 21600, 08f16698beb9cc15f7115961bd69e995 diff --git a/tests/ref/lavf/ffm b/tests/ref/lavf/ffm index 54c56034aa..d9fa8d52cb 100644 --- a/tests/ref/lavf/ffm +++ b/tests/ref/lavf/ffm @@ -1,3 +1,3 @@ -a0e9616f0d9a8c1029f3220b1b9175f4 *./tests/data/lavf/lavf.ffm +ca2a450cd0d1e299514a345923b4c82a *./tests/data/lavf/lavf.ffm 376832 ./tests/data/lavf/lavf.ffm ./tests/data/lavf/lavf.ffm CRC=0x000e23ae diff --git a/tests/ref/lavf/mxf b/tests/ref/lavf/mxf index e1c0c79b05..103ef010b7 100644 --- a/tests/ref/lavf/mxf +++ b/tests/ref/lavf/mxf @@ -1,9 +1,9 @@ -f9b570c7b4fbbc2b71f2236b32e7cbb6 *./tests/data/lavf/lavf.mxf +c61e677b4facc407ca82b1d7c6298484 *./tests/data/lavf/lavf.mxf 525369 ./tests/data/lavf/lavf.mxf ./tests/data/lavf/lavf.mxf CRC=0xdbfff6f1 -8f6a9a6b409f0f5a0bf003f8dea26314 *./tests/data/lavf/lavf.mxf +1ae017b5879992431614b1c7ab3b48c5 *./tests/data/lavf/lavf.mxf 560697 ./tests/data/lavf/lavf.mxf ./tests/data/lavf/lavf.mxf CRC=0x11a6178e -10ac0f158fc0af356439b818de7601e3 *./tests/data/lavf/lavf.mxf +27fac91dce279630a04b94b93518a9d8 *./tests/data/lavf/lavf.mxf 525369 ./tests/data/lavf/lavf.mxf ./tests/data/lavf/lavf.mxf CRC=0xdbfff6f1