You've already forked FFmpeg
mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-08-04 22:03:09 +02:00
mov: Export frame packing information from pack box
This commit is contained in:
@ -6594,6 +6594,85 @@ static int mov_read_st3d(MOVContext *c, AVIOContext *pb, MOVAtom atom)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int mov_read_pack(MOVContext *c, AVIOContext *pb, MOVAtom atom)
|
||||||
|
{
|
||||||
|
AVStream *st;
|
||||||
|
MOVStreamContext *sc;
|
||||||
|
int size = 0;
|
||||||
|
int64_t remaining;
|
||||||
|
uint32_t tag = 0;
|
||||||
|
enum AVStereo3DType type = AV_STEREO3D_2D;
|
||||||
|
|
||||||
|
if (c->fc->nb_streams < 1)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
st = c->fc->streams[c->fc->nb_streams - 1];
|
||||||
|
sc = st->priv_data;
|
||||||
|
|
||||||
|
remaining = atom.size;
|
||||||
|
while (remaining > 0) {
|
||||||
|
size = avio_rb32(pb);
|
||||||
|
if (size < 8 || size > remaining ) {
|
||||||
|
av_log(c->fc, AV_LOG_ERROR, "Invalid child size in pack box\n");
|
||||||
|
return AVERROR_INVALIDDATA;
|
||||||
|
}
|
||||||
|
|
||||||
|
tag = avio_rl32(pb);
|
||||||
|
switch (tag) {
|
||||||
|
case MKTAG('p','k','i','n'): {
|
||||||
|
if (size != 16) {
|
||||||
|
av_log(c->fc, AV_LOG_ERROR, "Invalid size of pkin box: %d\n", size);
|
||||||
|
return AVERROR_INVALIDDATA;
|
||||||
|
}
|
||||||
|
avio_skip(pb, 1); // version
|
||||||
|
avio_skip(pb, 3); // flags
|
||||||
|
|
||||||
|
tag = avio_rl32(pb);
|
||||||
|
switch (tag) {
|
||||||
|
case MKTAG('s','i','d','e'):
|
||||||
|
type = AV_STEREO3D_SIDEBYSIDE;
|
||||||
|
break;
|
||||||
|
case MKTAG('o','v','e','r'):
|
||||||
|
type = AV_STEREO3D_TOPBOTTOM;
|
||||||
|
break;
|
||||||
|
case 0:
|
||||||
|
// This means value will be set in another layer
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
av_log(c->fc, AV_LOG_WARNING, "Unknown tag in pkin: 0x%08X\n", tag);
|
||||||
|
avio_skip(pb, size - 8);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
av_log(c->fc, AV_LOG_WARNING, "Unknown tag in pack: 0x%08X\n", tag);
|
||||||
|
avio_skip(pb, size - 8);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
remaining -= size;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (remaining != 0) {
|
||||||
|
av_log(c->fc, AV_LOG_ERROR, "Broken pack box\n");
|
||||||
|
return AVERROR_INVALIDDATA;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (type == AV_STEREO3D_2D)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (!sc->stereo3d) {
|
||||||
|
sc->stereo3d = av_stereo3d_alloc_size(&sc->stereo3d_size);
|
||||||
|
if (!sc->stereo3d)
|
||||||
|
return AVERROR(ENOMEM);
|
||||||
|
}
|
||||||
|
|
||||||
|
sc->stereo3d->type = type;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int mov_read_sv3d(MOVContext *c, AVIOContext *pb, MOVAtom atom)
|
static int mov_read_sv3d(MOVContext *c, AVIOContext *pb, MOVAtom atom)
|
||||||
{
|
{
|
||||||
AVStream *st;
|
AVStream *st;
|
||||||
@ -7005,6 +7084,13 @@ static int mov_read_vexu(MOVContext *c, AVIOContext *pb, MOVAtom atom)
|
|||||||
return ret;
|
return ret;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case MKTAG('p','a','c','k'): {
|
||||||
|
MOVAtom pack = { tag, size - 8 };
|
||||||
|
int ret = mov_read_pack(c, pb, pack);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
av_log(c->fc, AV_LOG_WARNING, "Unknown tag in vexu: 0x%08X\n", tag);
|
av_log(c->fc, AV_LOG_WARNING, "Unknown tag in vexu: 0x%08X\n", tag);
|
||||||
avio_skip(pb, size - 8);
|
avio_skip(pb, size - 8);
|
||||||
|
Reference in New Issue
Block a user