Signed-off-by: Michael Niedermayer <michae...@gmx.at> --- libavformat/mxfenc.c | 74 ++++++++++++++------------------------------------ 1 file changed, 20 insertions(+), 54 deletions(-)
diff --git a/libavformat/mxfenc.c b/libavformat/mxfenc.c index 98f3479..1cfa176 100644 --- a/libavformat/mxfenc.c +++ b/libavformat/mxfenc.c @@ -38,6 +38,7 @@ #include "libavutil/random_seed.h" #include "libavutil/timecode.h" #include "libavutil/avassert.h" +#include "libavutil/pixdesc.h" #include "libavcodec/bytestream.h" #include "libavcodec/dnxhddata.h" #include "libavcodec/h264.h" @@ -1596,15 +1597,14 @@ static const UID mxf_h264_codec_uls[] = { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x32,0x31,0x09 }, // AVC High 422 Intra RP2027 Class 100 720/50p }; -static const UID *mxf_get_h264_codec_ul(AVCodecContext *avctx, SPS *sps) +static const UID *mxf_get_h264_codec_ul(AVCodecContext *avctx) { int long_gop = avctx->gop_size > 1 || avctx->has_b_frames; - if ((sps->constraint_set_flags >> 3) & 1) { - if (sps->profile_idc == 110) - return &mxf_h264_codec_uls[2]; - else if (sps->profile_idc == 122) - return &mxf_h264_codec_uls[9]; + if (avctx->profile == FF_PROFILE_H264_HIGH_10_INTRA) { + return &mxf_h264_codec_uls[2]; + } else if (avctx->profile == FF_PROFILE_H264_HIGH_422_INTRA) { + return &mxf_h264_codec_uls[9]; } if (long_gop) return &mxf_h264_codec_uls[0]; @@ -1616,11 +1616,10 @@ static int mxf_parse_h264_frame(AVFormatContext *s, AVStream *st, AVPacket *pkt, MXFIndexEntry *e) { MXFStreamContext *sc = st->priv_data; - H264Context h; const uint8_t *buf = pkt->data; const uint8_t *buf_end = pkt->data + pkt->size; uint32_t state = -1; - AVRational sar = {1, 1}; + AVRational dar = {st->codec->width, st->codec->height}; if (pkt->size < 5 || AV_RB32(pkt->data) != 0x0000001) { av_log(s, AV_LOG_ERROR, "h264 bitstream malformated, " @@ -1628,63 +1627,27 @@ static int mxf_parse_h264_frame(AVFormatContext *s, AVStream *st, return 0; } - memset(&h, 0, sizeof(h)); - h.avctx = st->codec; - h.thread_context[0] = &h; - h.prev_frame_num = -1; + if (st->sample_aspect_ratio.num > 0 && st->sample_aspect_ratio.den > 0) { + dar.num = st->codec->width * st->sample_aspect_ratio.num; + dar.den = st->codec->height * st->sample_aspect_ratio.den; + } + av_reduce(&sc->aspect_ratio.num, &sc->aspect_ratio.den, + dar.num, dar.den, 1024*1024); - for (;;) { - int src_length, dst_length, consumed; - const uint8_t *ptr; + sc->interlaced = st->codec->field_order > AV_FIELD_PROGRESSIVE; + sc->codec_ul = mxf_get_h264_codec_ul(st->codec); + + for (;;) { buf = avpriv_find_start_code(buf, buf_end, &state); if (buf >= buf_end) break; --buf; - src_length = buf_end - buf; switch (state & 0x1f) { - case NAL_SLICE: - case NAL_IDR_SLICE: - // Do not walk the whole buffer just to decode slice header - if (src_length > 20) - src_length = 20; - break; - } - - ptr = ff_h264_decode_nal(&h, buf, &dst_length, &consumed, src_length); - if (!ptr || dst_length < 0) - break; - - init_get_bits(&h.gb, ptr, 8*dst_length); - //av_log(avctx, AV_LOG_DEBUG, "nal_unit_type:%d\n", h.nal_unit_type); - switch (h.nal_unit_type) { case NAL_SPS: - ff_h264_decode_seq_parameter_set(&h); - if (h.sps.sar.num > 0 && h.sps.sar.den > 0) { - sar.num = st->codec->width * h.sps.sar.num; - sar.den = st->codec->height * h.sps.sar.den; - } - sc->aspect_ratio.num = st->codec->width * sar.num; - sc->aspect_ratio.den = st->codec->height * sar.den; - av_reduce(&sc->aspect_ratio.num, &sc->aspect_ratio.den, - sar.num, sar.den, 1024*1024); - - sc->interlaced = !h.sps.frame_mbs_only_flag; - sc->component_depth = h.sps.bit_depth_luma; - - sc->codec_ul = mxf_get_h264_codec_ul(st->codec, &h.sps); e->flags |= 0x40; break; case NAL_PPS: - ff_h264_decode_picture_parameter_set(&h, h.gb.size_in_bits); - if (h.sps.timing_info_present_flag) { - if (st->codec->time_base.num != h.sps.num_units_in_tick || - st->codec->time_base.den*2 != h.sps.time_scale) { - av_log(s, AV_LOG_ERROR, "framerate does not match bitstream values: %d/%d != %d/%d\n", - h.sps.num_units_in_tick, h.sps.time_scale, st->codec->time_base.num, st->codec->time_base.den*2); - return 0; - } - } if (e->flags & 0x40) // sequence header present e->flags |= 0x80; // random access break; @@ -1844,8 +1807,11 @@ static int mxf_write_header(AVFormatContext *s) if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) { // TODO: should be avg_frame_rate AVRational rate, tbc = st->time_base; + const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(st->codec->pix_fmt); // Default component depth to 8 sc->component_depth = 8; + if (desc) + sc->component_depth = desc->comp[0].depth_minus1 + 1; mxf->timecode_base = (tbc.den + tbc.num/2) / tbc.num; spf = ff_mxf_get_samples_per_frame(s, tbc); if (!spf) { -- 1.7.9.5 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel