avformat/mov: set Stereo3D type when parsing eyes box

If view is defined in the child stri box, then the type must be set to
unspecified, as these boxes don't carry packing information.
Also, don't attach a useless Stereo 3D side data if the stream is monoscopic.

Signed-off-by: James Almer <jamrial@gmail.com>
This commit is contained in:
James Almer 2024-06-21 22:23:06 -03:00
parent 8af0919cc6
commit 0b330d8642
1 changed files with 9 additions and 1 deletions

View File

@ -6546,7 +6546,8 @@ static int mov_read_eyes(MOVContext *c, AVIOContext *pb, MOVAtom atom)
int size, flags = 0; int size, flags = 0;
int64_t remaining; int64_t remaining;
uint32_t tag, baseline = 0; uint32_t tag, baseline = 0;
enum AVStereo3DView view = AV_STEREO3D_VIEW_PACKED; enum AVStereo3DView view = AV_STEREO3D_VIEW_UNSPEC;
enum AVStereo3DType type = AV_STEREO3D_2D;
enum AVStereo3DPrimaryEye primary_eye = AV_PRIMARY_EYE_NONE; enum AVStereo3DPrimaryEye primary_eye = AV_PRIMARY_EYE_NONE;
AVRational horizontal_disparity_adjustment = { 0, 1 }; AVRational horizontal_disparity_adjustment = { 0, 1 };
@ -6596,6 +6597,9 @@ static int mov_read_eyes(MOVContext *c, AVIOContext *pb, MOVAtom atom)
view = AV_STEREO3D_VIEW_LEFT; view = AV_STEREO3D_VIEW_LEFT;
else if (has_right) else if (has_right)
view = AV_STEREO3D_VIEW_RIGHT; view = AV_STEREO3D_VIEW_RIGHT;
if (has_left || has_right)
type = AV_STEREO3D_UNSPEC;
break; break;
} }
case MKTAG('h','e','r','o'): { case MKTAG('h','e','r','o'): {
@ -6690,6 +6694,9 @@ static int mov_read_eyes(MOVContext *c, AVIOContext *pb, MOVAtom atom)
return AVERROR_INVALIDDATA; return AVERROR_INVALIDDATA;
} }
if (type == AV_STEREO3D_2D)
return 0;
if (!sc->stereo3d) { if (!sc->stereo3d) {
sc->stereo3d = av_stereo3d_alloc_size(&sc->stereo3d_size); sc->stereo3d = av_stereo3d_alloc_size(&sc->stereo3d_size);
if (!sc->stereo3d) if (!sc->stereo3d)
@ -6697,6 +6704,7 @@ static int mov_read_eyes(MOVContext *c, AVIOContext *pb, MOVAtom atom)
} }
sc->stereo3d->flags = flags; sc->stereo3d->flags = flags;
sc->stereo3d->type = type;
sc->stereo3d->view = view; sc->stereo3d->view = view;
sc->stereo3d->primary_eye = primary_eye; sc->stereo3d->primary_eye = primary_eye;
sc->stereo3d->baseline = baseline; sc->stereo3d->baseline = baseline;