On 16/02/16 03:44, Vittorio Giovara wrote:
> Samples produced by Omneon (Harmonic) store external references with
> paths ending with 0s. Such movs cannot be loaded properly since every
> 0 is converted to '/', to keep the same parsing code for dref type 2
> and type 18: this makes the external reference point to a non-existing
> direactory, rather than to the actual referenced file.
> 
> Add a brief trimming loop that drops all ending 0s before trying to
> parse the external reference path.
> 
> Signed-off-by: Vittorio Giovara <[email protected]>
> ---
> Note: all samples I was given only have one zero appended, so it might
> be enough to just do something like
> 
> -if (dref->path[j] == ':' || dref->path[j] == 0)
> +if (dref->path[j] == ':' || (dref->path[j] == 0 && j < len -1))
> 
> the loop seems safer but potentially wasteful.
> Opinions?
> Vittorio
> 
>  libavformat/mov.c | 7 +++++++
>  1 file changed, 7 insertions(+)
> 
> diff --git a/libavformat/mov.c b/libavformat/mov.c
> index 1cb91b9..7081ead 100644
> --- a/libavformat/mov.c
> +++ b/libavformat/mov.c
> @@ -554,6 +554,13 @@ static int mov_read_dref(MOVContext *c, AVIOContext *pb, 
> MOVAtom atom)
>                          memmove(dref->path, dref->path+volume_len, len);
>                          dref->path[len] = 0;
>                      }
> +                    // trim string of any ending zeros
> +                    for (j = len - 1; j >= 0; j--) {
> +                        if (dref->path[j] == 0)
> +                            len--;
> +                        else
> +                            break;
> +                    }
>                      for (j = 0; j < len; j++)
>                          if (dref->path[j] == ':' || dref->path[j] == 0)
>                              dref->path[j] = '/';
> 

breaking the other loop in the presence of 0 isn't an option?


_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to