On 19/08/13 20:08, John Stebbins wrote:
> From: John Stebbins <[email protected]>
> 
> Adds "moov_size" option to reserve space for moov at the front of the
> file.
> 
> Author: Michael Neidermayer
> commit: 3a56169f
> ---
>  libavformat/movenc.c | 22 ++++++++++++++++++++--
>  libavformat/movenc.h |  3 +++
>  2 files changed, 23 insertions(+), 2 deletions(-)
> 
> diff --git a/libavformat/movenc.c b/libavformat/movenc.c
> index 12dce84..82590ad 100644
> --- a/libavformat/movenc.c
> +++ b/libavformat/movenc.c
> @@ -51,6 +51,7 @@ static const AVOption options[] = {
>      { "separate_moof", "Write separate moof/mdat atoms for each track", 0, 
> AV_OPT_TYPE_CONST, {.i64 = FF_MOV_FLAG_SEPARATE_MOOF}, INT_MIN, INT_MAX, 
> AV_OPT_FLAG_ENCODING_PARAM, "movflags" },
>      { "frag_custom", "Flush fragments on caller requests", 0, 
> AV_OPT_TYPE_CONST, {.i64 = FF_MOV_FLAG_FRAG_CUSTOM}, INT_MIN, INT_MAX, 
> AV_OPT_FLAG_ENCODING_PARAM, "movflags" },
>      { "isml", "Create a live smooth streaming feed (for pushing to a 
> publishing point)", 0, AV_OPT_TYPE_CONST, {.i64 = FF_MOV_FLAG_ISML}, INT_MIN, 
> INT_MAX, AV_OPT_FLAG_ENCODING_PARAM, "movflags" },
> +    { "moov_size", "maximum moov size so it can be placed at the begin", 
> offsetof(MOVMuxContext, reserved_moov_size), AV_OPT_TYPE_INT, {.dbl = 0}, 0, 
> INT_MAX, AV_OPT_FLAG_ENCODING_PARAM, 0 },
>      FF_RTP_FLAG_OPTS(MOVMuxContext, rtp_flags),
>      { "skip_iods", "Skip writing iods atom.", offsetof(MOVMuxContext, 
> iods_skip), AV_OPT_TYPE_INT, {.i64 = 0}, 0, 1, AV_OPT_FLAG_ENCODING_PARAM},
>      { "iods_audio_profile", "iods audio profile atom.", 
> offsetof(MOVMuxContext, iods_audio_profile), AV_OPT_TYPE_INT, {.i64 = -1}, 
> -1, 255, AV_OPT_FLAG_ENCODING_PARAM},
> @@ -3156,8 +3157,13 @@ static int mov_write_header(AVFormatContext *s)
>                        FF_MOV_FLAG_FRAGMENT;
>      }
>  
> -    if (!(mov->flags & FF_MOV_FLAG_FRAGMENT))
> +    if (!(mov->flags & FF_MOV_FLAG_FRAGMENT)) {
> +        if(mov->reserved_moov_size) {
> +            mov->reserved_moov_pos= avio_tell(pb);
                                     ^
They coding style is wrong ...........

> +            avio_skip(pb, mov->reserved_moov_size);
> +        }
>          mov_write_mdat_tag(pb, mov);
> +    }
>  
>      if (t = av_dict_get(s->metadata, "creation_time", NULL, 0))
>          mov->time = ff_iso8601_to_unix_time(t->value);
> @@ -3229,9 +3235,21 @@ static int mov_write_trailer(AVFormatContext *s)
>              ffio_wfourcc(pb, "mdat");
>              avio_wb64(pb, mov->mdat_size + 16);
>          }
> -        avio_seek(pb, moov_pos, SEEK_SET);
> +        avio_seek(pb, mov->reserved_moov_size ? mov->reserved_moov_pos : 
> moov_pos, SEEK_SET);

>          mov_write_moov_tag(pb, mov, s);
> +        if (mov->reserved_moov_size) {
> +            int64_t size=  mov->reserved_moov_size - (avio_tell(pb) - 
> mov->reserved_moov_pos);
                           ^
Again          .............

> +            if(size < 8){
> +                av_log(s, AV_LOG_ERROR, "reserved_moov_size is too small, 
> needed %"PRId64" additional\n", 8-size);
> +                return -1;
> +            }

Coding style and -1 instead of AVERROR(EIO) or similar.

> +            avio_wb32(pb, size);
> +            ffio_wfourcc(pb, "free");
> +            for(i=0; i<size; i++)
> +                avio_w8(pb, 0);
> +            avio_seek(pb, moov_pos, SEEK_SET);
> +        }
>      } else {
>          mov_flush_fragment(s);
>          mov_write_mfra_tag(pb, mov);
> diff --git a/libavformat/movenc.h b/libavformat/movenc.h
> index d15d69c..cf883f6 100644
> --- a/libavformat/movenc.h
> +++ b/libavformat/movenc.h
> @@ -156,6 +156,9 @@ typedef struct MOVMuxContext {
>      int max_fragment_size;
>      int ism_lookahead;
>      AVIOContext *mdat_buf;
> +
> +    int reserved_moov_size;
> +    int64_t reserved_moov_pos;
>  } MOVMuxContext;

Probably we should put in the documentation which value is sane and/or
provide a guess if the user does not know better.

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

Reply via email to