[FFmpeg-devel] [PATCH] mov: Support fake moov boxes disguised as hoov
Vittorio Giovara
vittorio.giovara at gmail.com
Mon Aug 12 14:46:55 EEST 2019
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?
--
Vittorio
More information about the ffmpeg-devel
mailing list