avformat/mxfenc: factorize timecode checking and setting

Signed-off-by: Marton Balint <cus@passwd.hu>
This commit is contained in:
Marton Balint 2020-03-03 23:13:07 +01:00
parent ae4d00b97f
commit 331b96acb5
1 changed files with 13 additions and 19 deletions

View File

@ -2407,17 +2407,24 @@ static void mxf_gen_umid(AVFormatContext *s)
mxf->instance_number = seed & 0xFFFFFF;
}
static int mxf_init_timecode(AVFormatContext *s, AVStream *st, AVRational rate)
static int mxf_init_timecode(AVFormatContext *s, AVStream *st, AVRational tbc)
{
MXFContext *mxf = s->priv_data;
AVDictionaryEntry *tcr = av_dict_get(s->metadata, "timecode", NULL, 0);
if (!ff_mxf_get_content_package_rate(tbc)) {
av_log(s, AV_LOG_ERROR, "Unsupported frame rate %d/%d\n", tbc.den, tbc.num);
return AVERROR(EINVAL);
}
mxf->timecode_base = (tbc.den + tbc.num/2) / tbc.num;
if (!tcr)
tcr = av_dict_get(st->metadata, "timecode", NULL, 0);
if (tcr)
return av_timecode_init_from_string(&mxf->tc, rate, tcr->value, s);
return av_timecode_init_from_string(&mxf->tc, av_inv_q(tbc), tcr->value, s);
else
return av_timecode_init(&mxf->tc, rate, 0, 0, s);
return av_timecode_init(&mxf->tc, av_inv_q(tbc), 0, 0, s);
}
static int mxf_write_header(AVFormatContext *s)
@ -2454,7 +2461,7 @@ static int mxf_write_header(AVFormatContext *s)
if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
const AVPixFmtDescriptor *pix_desc = av_pix_fmt_desc_get(st->codecpar->format);
// TODO: should be avg_frame_rate
AVRational rate, tbc = st->time_base;
AVRational tbc = st->time_base;
// Default component depth to 8
sc->component_depth = 8;
sc->h_chroma_sub_sample = 2;
@ -2479,16 +2486,9 @@ static int mxf_write_header(AVFormatContext *s)
}
mxf->content_package_rate = ff_mxf_get_content_package_rate(tbc);
if (!mxf->content_package_rate) {
av_log(s, AV_LOG_ERROR, "Unsupported video frame rate %d/%d\n",
tbc.den, tbc.num);
return AVERROR(EINVAL);
}
mxf->timecode_base = (tbc.den + tbc.num/2) / tbc.num;
mxf->time_base = tbc;
rate = av_inv_q(mxf->time_base);
avpriv_set_pts_info(st, 64, mxf->time_base.num, mxf->time_base.den);
if((ret = mxf_init_timecode(s, st, rate)) < 0)
if((ret = mxf_init_timecode(s, st, tbc)) < 0)
return ret;
if (st->codecpar->codec_id == AV_CODEC_ID_MPEG2VIDEO) {
@ -2564,16 +2564,10 @@ static int mxf_write_header(AVFormatContext *s)
return AVERROR(EINVAL);
}
if (!ff_mxf_get_content_package_rate(tbc)) {
av_log(s, AV_LOG_ERROR, "Unsupported timecode frame rate %d/%d\n", tbc.den, tbc.num);
return AVERROR(EINVAL);
}
mxf->time_base = st->time_base;
if((ret = mxf_init_timecode(s, st, av_inv_q(tbc))) < 0)
if((ret = mxf_init_timecode(s, st, tbc)) < 0)
return ret;
mxf->timecode_base = (tbc.den + tbc.num/2) / tbc.num;
mxf->edit_unit_byte_count = (av_get_bits_per_sample(st->codecpar->codec_id) * st->codecpar->channels) >> 3;
sc->index = INDEX_WAV;
} else {