[FFmpeg-devel] [PATCH] mov: Support fake moov boxes disguised as hoov

Michael Niedermayer michael at niedermayer.cc
Mon Aug 12 22:37:24 EEST 2019


On Mon, Aug 12, 2019 at 01:46:55PM +0200, Vittorio Giovara wrote:
> On Thu, Aug 8, 2019 at 10:28 PM Vittorio Giovara <vittorio.giovara at gmail.com>
> wrote:
> 
> > Some broken apps generate files that have a fake box named 'hoov'
> > instead of a proper 'moov' one. This is speculation but it seems like
> > this box contains data to be modified later (eg as file grows in size,
> > data gets re-written) and its name is supposed to be changed to 'moov'
> > once it can be used as a 'moov', but for some reason this step is skipped.
> >
> > Since this is not the first time this happens ('moov' boxes can be found
> > in 'free' ones) extend the existing hacks to search for the moov in such
> > boxes and skip the moov_retry since it needs to be found right away.
> > ---
> >  libavformat/mov.c | 8 ++++----
> >  1 file changed, 4 insertions(+), 4 deletions(-)
> >
> > This code is ugly, tips for improving it are welcome, or a full
> > rejection is ok too. Unfortunately I cannot share the sample, but VLC
> > is able to play it.
> > Vittorio
> >
> > diff --git a/libavformat/mov.c b/libavformat/mov.c
> > index 24de5429d1..0c2986b72e 100644
> > --- a/libavformat/mov.c
> > +++ b/libavformat/mov.c
> > @@ -6800,10 +6800,10 @@ static int mov_read_default(MOVContext *c,
> > AVIOContext *pb, MOVAtom atom)
> >          if (atom.size >= 8) {
> >              a.size = avio_rb32(pb);
> >              a.type = avio_rl32(pb);
> > -            if (a.type == MKTAG('f','r','e','e') &&
> > +            if (((a.type == MKTAG('f','r','e','e') && c->moov_retry) ||
> > +                  a.type == MKTAG('h','o','o','v')) &&
> >                  a.size >= 8 &&
> > -                c->fc->strict_std_compliance < FF_COMPLIANCE_STRICT &&
> > -                c->moov_retry) {
> > +                c->fc->strict_std_compliance < FF_COMPLIANCE_STRICT) {
> >                  uint8_t buf[8];
> >                  uint32_t *type = (uint32_t *)buf + 1;
> >                  if (avio_read(pb, buf, 8) != 8)
> > @@ -6811,7 +6811,7 @@ static int mov_read_default(MOVContext *c,
> > AVIOContext *pb, MOVAtom atom)
> >                  avio_seek(pb, -8, SEEK_CUR);
> >                  if (*type == MKTAG('m','v','h','d') ||
> >                      *type == MKTAG('c','m','o','v')) {
> > -                    av_log(c->fc, AV_LOG_ERROR, "Detected moov in a free
> > atom.\n");
> > +                    av_log(c->fc, AV_LOG_ERROR, "Detected moov in a free
> > or hoov atom.\n");
> >                      a.type = MKTAG('m','o','o','v');
> >                  }
> >              }
> > --
> >
> 
> ping?

probably ok, but same oppinion as you, cleaner solution preferred if anyone
has a cleaner one

Thanks

[...]
-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

Breaking DRM is a little like attempting to break through a door even
though the window is wide open and the only thing in the house is a bunch
of things you dont want and which you would get tomorrow for free anyway
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 181 bytes
Desc: not available
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20190812/5629b776/attachment.sig>


More information about the ffmpeg-devel mailing list