Commit 84b9b4aa authored by Joseph Artsimovich's avatar Joseph Artsimovich Committed by Michael Niedermayer

Fix frame height vs field height confusion in MXF decoding.

Reviewed-by: 's avatarTomas Härdin <tomas.hardin@codemill.se>
Reveiwed-by: 's avatarBaptiste Coudurier <baptiste.coudurier@gmail.com>
Signed-off-by: 's avatarMichael Niedermayer <michaelni@gmx.at>
parent 4ed0d182
...@@ -46,6 +46,14 @@ enum MXFMetadataSetType { ...@@ -46,6 +46,14 @@ enum MXFMetadataSetType {
TypeBottom,// add metadata type before this TypeBottom,// add metadata type before this
}; };
enum MXFFrameLayout {
FullFrame = 0,
MixedFields,
OneField,
SegmentedFrame,
SeparateFields
};
typedef struct { typedef struct {
UID key; UID key;
int64_t offset; int64_t offset;
......
...@@ -142,7 +142,8 @@ typedef struct { ...@@ -142,7 +142,8 @@ typedef struct {
AVRational sample_rate; AVRational sample_rate;
AVRational aspect_ratio; AVRational aspect_ratio;
int width; int width;
int height; int height; /* Field height, not frame height */
int frame_layout; /* See MXFFrameLayout enum */
int channels; int channels;
int bits_per_sample; int bits_per_sample;
unsigned int component_depth; unsigned int component_depth;
...@@ -832,6 +833,9 @@ static int mxf_read_generic_descriptor(void *arg, AVIOContext *pb, int tag, int ...@@ -832,6 +833,9 @@ static int mxf_read_generic_descriptor(void *arg, AVIOContext *pb, int tag, int
case 0x3202: case 0x3202:
descriptor->height = avio_rb32(pb); descriptor->height = avio_rb32(pb);
break; break;
case 0x320C:
descriptor->frame_layout = avio_r8(pb);
break;
case 0x320E: case 0x320E:
descriptor->aspect_ratio.num = avio_rb32(pb); descriptor->aspect_ratio.num = avio_rb32(pb);
descriptor->aspect_ratio.den = avio_rb32(pb); descriptor->aspect_ratio.den = avio_rb32(pb);
...@@ -1493,7 +1497,26 @@ static int mxf_parse_structural_metadata(MXFContext *mxf) ...@@ -1493,7 +1497,26 @@ static int mxf_parse_structural_metadata(MXFContext *mxf)
if (st->codec->codec_id == CODEC_ID_NONE) if (st->codec->codec_id == CODEC_ID_NONE)
st->codec->codec_id = container_ul->id; st->codec->codec_id = container_ul->id;
st->codec->width = descriptor->width; st->codec->width = descriptor->width;
st->codec->height = descriptor->height; st->codec->height = descriptor->height; /* Field height, not frame height */
switch (descriptor->frame_layout) {
case SegmentedFrame:
/* This one is a weird layout I don't fully understand. */
av_log(mxf->fc, AV_LOG_INFO, "SegmentedFrame layout isn't currently supported\n");
break;
case FullFrame:
break;
case OneField:
/* Every other line is stored and needs to be duplicated. */
av_log(mxf->fc, AV_LOG_INFO, "OneField frame layout isn't currently supported\n");
break; /* The correct thing to do here is fall through, but by breaking we might be
able to decode some streams at half the vertical resolution, rather than not al all.
It's also for compatibility with the old behavior. */
case SeparateFields:
case MixedFields:
st->codec->height *= 2; /* Turn field height into frame height. */
default:
av_log(mxf->fc, AV_LOG_INFO, "Unknown frame layout type: %d\n", descriptor->frame_layout);
}
if (st->codec->codec_id == CODEC_ID_RAWVIDEO) { if (st->codec->codec_id == CODEC_ID_RAWVIDEO) {
st->codec->pix_fmt = descriptor->pix_fmt; st->codec->pix_fmt = descriptor->pix_fmt;
if (st->codec->pix_fmt == PIX_FMT_NONE) { if (st->codec->pix_fmt == PIX_FMT_NONE) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment