mirror of
https://github.com/xenia-project/FFmpeg.git
synced 2024-11-27 13:30:45 +00:00
ffmpeg: pass decoded or filtered AVFrame to output stream initialization
Additionally, reap the first rewards by being able to set the color related encoding values based on the passed AVFrame. The only tests that seem to have changed their results with this change seem to be the MXF tests. There, the muxer writes the limited/full range flag to the output container if the encoder is not set to "unspecified".
This commit is contained in:
parent
67be1ce0c6
commit
7369595c55
@ -947,9 +947,11 @@ early_exit:
|
||||
return float_pts;
|
||||
}
|
||||
|
||||
static int init_output_stream(OutputStream *ost, char *error, int error_len);
|
||||
static int init_output_stream(OutputStream *ost, AVFrame *frame,
|
||||
char *error, int error_len);
|
||||
|
||||
static int init_output_stream_wrapper(OutputStream *ost, unsigned int fatal)
|
||||
static int init_output_stream_wrapper(OutputStream *ost, AVFrame *frame,
|
||||
unsigned int fatal)
|
||||
{
|
||||
int ret = AVERROR_BUG;
|
||||
char error[1024] = {0};
|
||||
@ -957,7 +959,7 @@ static int init_output_stream_wrapper(OutputStream *ost, unsigned int fatal)
|
||||
if (ost->initialized)
|
||||
return 0;
|
||||
|
||||
ret = init_output_stream(ost, error, sizeof(error));
|
||||
ret = init_output_stream(ost, frame, 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);
|
||||
@ -1131,7 +1133,7 @@ static void do_video_out(OutputFile *of,
|
||||
InputStream *ist = NULL;
|
||||
AVFilterContext *filter = ost->filter->filter;
|
||||
|
||||
init_output_stream_wrapper(ost, 1);
|
||||
init_output_stream_wrapper(ost, next_picture, 1);
|
||||
sync_ipts = adjust_frame_pts_to_encoder_tb(of, ost, next_picture);
|
||||
|
||||
if (ost->source_index >= 0)
|
||||
@ -1513,7 +1515,7 @@ static int reap_filters(int flush)
|
||||
* the encoder earlier than receiving the first AVFrame.
|
||||
*/
|
||||
if (av_buffersink_get_type(filter) == AVMEDIA_TYPE_AUDIO)
|
||||
init_output_stream_wrapper(ost, 1);
|
||||
init_output_stream_wrapper(ost, NULL, 1);
|
||||
|
||||
if (!ost->filtered_frame && !(ost->filtered_frame = av_frame_alloc())) {
|
||||
return AVERROR(ENOMEM);
|
||||
@ -1936,7 +1938,7 @@ static void flush_encoders(void)
|
||||
finish_output_stream(ost);
|
||||
}
|
||||
|
||||
init_output_stream_wrapper(ost, 1);
|
||||
init_output_stream_wrapper(ost, NULL, 1);
|
||||
}
|
||||
|
||||
if (enc->codec_type != AVMEDIA_TYPE_VIDEO && enc->codec_type != AVMEDIA_TYPE_AUDIO)
|
||||
@ -3309,7 +3311,7 @@ static void init_encoder_time_base(OutputStream *ost, AVRational default_time_ba
|
||||
enc_ctx->time_base = default_time_base;
|
||||
}
|
||||
|
||||
static int init_output_stream_encode(OutputStream *ost)
|
||||
static int init_output_stream_encode(OutputStream *ost, AVFrame *frame)
|
||||
{
|
||||
InputStream *ist = get_input_stream(ost);
|
||||
AVCodecContext *enc_ctx = ost->enc_ctx;
|
||||
@ -3406,6 +3408,14 @@ static int init_output_stream_encode(OutputStream *ost)
|
||||
enc_ctx->bits_per_raw_sample = FFMIN(dec_ctx->bits_per_raw_sample,
|
||||
av_pix_fmt_desc_get(enc_ctx->pix_fmt)->comp[0].depth);
|
||||
|
||||
if (frame) {
|
||||
enc_ctx->color_range = frame->color_range;
|
||||
enc_ctx->color_primaries = frame->color_primaries;
|
||||
enc_ctx->color_trc = frame->color_trc;
|
||||
enc_ctx->colorspace = frame->colorspace;
|
||||
enc_ctx->chroma_sample_location = frame->chroma_location;
|
||||
}
|
||||
|
||||
enc_ctx->framerate = ost->frame_rate;
|
||||
|
||||
ost->st->avg_frame_rate = ost->frame_rate;
|
||||
@ -3463,7 +3473,8 @@ static int init_output_stream_encode(OutputStream *ost)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int init_output_stream(OutputStream *ost, char *error, int error_len)
|
||||
static int init_output_stream(OutputStream *ost, AVFrame *frame,
|
||||
char *error, int error_len)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
@ -3472,7 +3483,7 @@ static int init_output_stream(OutputStream *ost, char *error, int error_len)
|
||||
AVCodecContext *dec = NULL;
|
||||
InputStream *ist;
|
||||
|
||||
ret = init_output_stream_encode(ost);
|
||||
ret = init_output_stream_encode(ost, frame);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
@ -3724,7 +3735,7 @@ static int transcode_init(void)
|
||||
output_streams[i]->enc_ctx->codec_type == AVMEDIA_TYPE_AUDIO))
|
||||
continue;
|
||||
|
||||
ret = init_output_stream_wrapper(output_streams[i], 0);
|
||||
ret = init_output_stream_wrapper(output_streams[i], NULL, 0);
|
||||
if (ret < 0)
|
||||
goto dump_format;
|
||||
}
|
||||
@ -4657,7 +4668,7 @@ static int transcode_step(void)
|
||||
* early encoder initialization.
|
||||
*/
|
||||
if (av_buffersink_get_type(ost->filter->filter) == AVMEDIA_TYPE_AUDIO)
|
||||
init_output_stream_wrapper(ost, 1);
|
||||
init_output_stream_wrapper(ost, NULL, 1);
|
||||
|
||||
if ((ret = transcode_from_filter(ost->filter->graph, &ist)) < 0)
|
||||
return ret;
|
||||
|
@ -1,3 +1,3 @@
|
||||
e597f73ef9c9819710d2f815813eb91f *tests/data/lavf/lavf.mxf_d10
|
||||
36fc2a640368f6d33987d2b2d39df966 *tests/data/lavf/lavf.mxf_d10
|
||||
5332013 tests/data/lavf/lavf.mxf_d10
|
||||
tests/data/lavf/lavf.mxf_d10 CRC=0x6c74d488
|
||||
|
@ -1,3 +1,3 @@
|
||||
0fc964fa22bc8b3a389b81b9a2efccb3 *tests/data/lavf/lavf.mxf_dv25
|
||||
57623b3b968c0bb0d8a0bbaeef6fe657 *tests/data/lavf/lavf.mxf_dv25
|
||||
3834413 tests/data/lavf/lavf.mxf_dv25
|
||||
tests/data/lavf/lavf.mxf_dv25 CRC=0xbdaf7f52
|
||||
|
@ -1,3 +1,3 @@
|
||||
aa81ea83af44a69e73849e327cc4bd12 *tests/data/lavf/lavf.mxf_dvcpro50
|
||||
6e82b4cc962199e2593e30851ff7ccfb *tests/data/lavf/lavf.mxf_dvcpro50
|
||||
7431213 tests/data/lavf/lavf.mxf_dvcpro50
|
||||
tests/data/lavf/lavf.mxf_dvcpro50 CRC=0xe3bbe4b4
|
||||
|
@ -1,3 +1,3 @@
|
||||
06a1816aa91c733e1ef7e45d82e4f1d3 *tests/data/lavf/lavf.mxf_opatom
|
||||
d5f56215c2b16dee204f03bfa653dd1b *tests/data/lavf/lavf.mxf_opatom
|
||||
4717625 tests/data/lavf/lavf.mxf_opatom
|
||||
tests/data/lavf/lavf.mxf_opatom CRC=0xf55aa22a
|
||||
|
Loading…
Reference in New Issue
Block a user