Also advice user how to reconstruct full frames using setfield,tinterlace filters. --- libavformat/mxfdec.c | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-)
diff --git a/libavformat/mxfdec.c b/libavformat/mxfdec.c index 0495a2e..c966a0a 100644 --- a/libavformat/mxfdec.c +++ b/libavformat/mxfdec.c @@ -2036,7 +2036,30 @@ static int mxf_parse_structural_metadata(MXFContext *mxf) default: av_log(mxf->fc, AV_LOG_INFO, "Unknown frame layout type: %d\n", descriptor->frame_layout); } - if (st->codec->codec_id == AV_CODEC_ID_RAWVIDEO) { + switch (st->codec->codec_id) { + case AV_CODEC_ID_JPEG2000: + if (descriptor->frame_layout == SegmentedFrame || + descriptor->frame_layout == SeparateFields) { + const char *buf; + const char* fdstr[] = { "tff", "bff" }; + int layout = descriptor->frame_layout; + + buf = layout == SegmentedFrame ? "segmented_frame" : "separate_fields"; + av_dict_set(&st->metadata, "mxf_frame_layout", buf, 0); + + if (descriptor->field_dominance != 1 && + descriptor->field_dominance != 2) { + av_log(mxf->fc, AV_LOG_INFO, + "Invalid field dominance value: %d, defaulting to TFF\n", descriptor->field_dominance); + buf = fdstr[0]; + } else + buf = fdstr[descriptor->field_dominance - 1]; + + av_dict_set(&st->metadata, "mxf_field_dominance", buf, 0); + av_log(mxf->fc, AV_LOG_INFO, "Use filtergraph setfield=mode=%s,tinterlace to get full frames\n", buf); + } + break; + case AV_CODEC_ID_RAWVIDEO: st->codec->pix_fmt = descriptor->pix_fmt; if (st->codec->pix_fmt == AV_PIX_FMT_NONE) { pix_fmt_ul = mxf_get_codec_ul(ff_mxf_pixel_format_uls, @@ -2052,6 +2075,7 @@ static int mxf_parse_structural_metadata(MXFContext *mxf) } } } + break; } st->need_parsing = AVSTREAM_PARSE_HEADERS; if (material_track->sequence->origin) { -- 2.4.6 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel