Store the video bit_rate in the context when muxing mxf.

This will allow using rc_max_rate if no bit_rate is specified (on remuxing).

Reviewed-by: Matthieu Bouron
(cherry picked from commit 52cf08b4c8)
This commit is contained in:
Carl Eugen Hoyos
2013-09-09 10:02:12 +02:00
parent 283e070877
commit aaef59d535

View File

@@ -75,6 +75,7 @@ typedef struct {
int temporal_reordering; int temporal_reordering;
AVRational aspect_ratio; ///< display aspect ratio AVRational aspect_ratio; ///< display aspect ratio
int closed_gop; ///< gop is closed, used in mpeg-2 frame parsing int closed_gop; ///< gop is closed, used in mpeg-2 frame parsing
int video_bit_rate;
} MXFStreamContext; } MXFStreamContext;
typedef struct { typedef struct {
@@ -975,13 +976,14 @@ static void mxf_write_cdci_desc(AVFormatContext *s, AVStream *st)
static void mxf_write_mpegvideo_desc(AVFormatContext *s, AVStream *st) static void mxf_write_mpegvideo_desc(AVFormatContext *s, AVStream *st)
{ {
AVIOContext *pb = s->pb; AVIOContext *pb = s->pb;
MXFStreamContext *sc = st->priv_data;
int profile_and_level = (st->codec->profile<<4) | st->codec->level; int profile_and_level = (st->codec->profile<<4) | st->codec->level;
mxf_write_cdci_common(s, st, mxf_mpegvideo_descriptor_key, 8+5); mxf_write_cdci_common(s, st, mxf_mpegvideo_descriptor_key, 8+5);
// bit rate // bit rate
mxf_write_local_tag(pb, 4, 0x8000); mxf_write_local_tag(pb, 4, 0x8000);
avio_wb32(pb, st->codec->bit_rate); avio_wb32(pb, sc->video_bit_rate);
// profile and level // profile and level
mxf_write_local_tag(pb, 1, 0x8007); mxf_write_local_tag(pb, 1, 0x8007);
@@ -1704,14 +1706,15 @@ static int mxf_write_header(AVFormatContext *s)
ret = av_timecode_init(&mxf->tc, rate, 0, 0, s); ret = av_timecode_init(&mxf->tc, rate, 0, 0, s);
if (ret < 0) if (ret < 0)
return ret; return ret;
sc->video_bit_rate = st->codec->bit_rate;
if (s->oformat == &ff_mxf_d10_muxer) { if (s->oformat == &ff_mxf_d10_muxer) {
if (st->codec->bit_rate == 50000000) { if (sc->video_bit_rate == 50000000) {
if (mxf->time_base.den == 25) sc->index = 3; if (mxf->time_base.den == 25) sc->index = 3;
else sc->index = 5; else sc->index = 5;
} else if (st->codec->bit_rate == 40000000) { } else if (sc->video_bit_rate == 40000000) {
if (mxf->time_base.den == 25) sc->index = 7; if (mxf->time_base.den == 25) sc->index = 7;
else sc->index = 9; else sc->index = 9;
} else if (st->codec->bit_rate == 30000000) { } else if (sc->video_bit_rate == 30000000) {
if (mxf->time_base.den == 25) sc->index = 11; if (mxf->time_base.den == 25) sc->index = 11;
else sc->index = 13; else sc->index = 13;
} else { } else {
@@ -1720,7 +1723,7 @@ static int mxf_write_header(AVFormatContext *s)
} }
mxf->edit_unit_byte_count = KAG_SIZE; // system element mxf->edit_unit_byte_count = KAG_SIZE; // system element
mxf->edit_unit_byte_count += 16 + 4 + (uint64_t)st->codec->bit_rate * mxf->edit_unit_byte_count += 16 + 4 + (uint64_t)sc->video_bit_rate *
mxf->time_base.num / (8*mxf->time_base.den); mxf->time_base.num / (8*mxf->time_base.den);
mxf->edit_unit_byte_count += klv_fill_size(mxf->edit_unit_byte_count); mxf->edit_unit_byte_count += klv_fill_size(mxf->edit_unit_byte_count);
mxf->edit_unit_byte_count += 16 + 4 + 4 + spf->samples_per_frame[0]*8*4; mxf->edit_unit_byte_count += 16 + 4 + 4 + spf->samples_per_frame[0]*8*4;
@@ -1854,7 +1857,8 @@ static void mxf_write_d10_video_packet(AVFormatContext *s, AVStream *st, AVPacke
{ {
MXFContext *mxf = s->priv_data; MXFContext *mxf = s->priv_data;
AVIOContext *pb = s->pb; AVIOContext *pb = s->pb;
int packet_size = (uint64_t)st->codec->bit_rate*mxf->time_base.num / MXFStreamContext *sc = st->priv_data;
int packet_size = (uint64_t)sc->video_bit_rate*mxf->time_base.num /
(8*mxf->time_base.den); // frame size (8*mxf->time_base.den); // frame size
int pad; int pad;