[FFmpeg-devel] [PATCH 11/17] avformat/assenc: mux all extradata at once

wm4 nfxjfg at googlemail.com
Sun Sep 21 08:32:15 CEST 2014


On Sat, 20 Sep 2014 22:27:51 +0200
Clément Bœsch <u at pkh.me> wrote:

> Before this commit, the code was muxing up to the 2nd line after
> "[Events]" (assuming it to be the "Format:" line). The remaining are
> generally "Comment:" directives which can stay in that place. mkvextract
> behaves that way so it seems there is no reason for that extra
> complexity.
> ---

Still LGTM generally, but...

>  libavformat/assenc.c | 26 ++++----------------------
>  1 file changed, 4 insertions(+), 22 deletions(-)
> 
> diff --git a/libavformat/assenc.c b/libavformat/assenc.c
> index 2afeef7..236d021 100644
> --- a/libavformat/assenc.c
> +++ b/libavformat/assenc.c
> @@ -30,7 +30,6 @@ typedef struct DialogueLine {
>  } DialogueLine;
>  
>  typedef struct ASSContext{
> -    unsigned int extra_index;
>      int write_ts; // 0: ssa (timing in payload), 1: ass (matroska like)
>      int expected_readorder;
>      DialogueLine *dialogue_cache;
> @@ -42,7 +41,6 @@ static int write_header(AVFormatContext *s)
>  {
>      ASSContext *ass = s->priv_data;
>      AVCodecContext *avctx= s->streams[0]->codec;
> -    uint8_t *last= NULL;
>  
>      if (s->nb_streams != 1 || (avctx->codec_id != AV_CODEC_ID_SSA &&
>                                 avctx->codec_id != AV_CODEC_ID_ASS)) {
> @@ -51,21 +49,11 @@ static int write_header(AVFormatContext *s)
>      }
>      ass->write_ts = avctx->codec_id == AV_CODEC_ID_ASS;
>      avpriv_set_pts_info(s->streams[0], 64, 1, 100);
> -
> -    while(ass->extra_index < avctx->extradata_size){
> -        uint8_t *p  = avctx->extradata + ass->extra_index;
> -        uint8_t *end= strchr(p, '\n');
> -        if(!end) end= avctx->extradata + avctx->extradata_size;
> -        else     end++;
> -
> -        avio_write(s->pb, p, end-p);
> -        ass->extra_index += end-p;
> -
> -        if(last && !memcmp(last, "[Events]", 8))
> -            break;
> -        last=p;
> +    if (avctx->extradata_size > 0) {
> +        avio_write(s->pb, avctx->extradata, avctx->extradata_size);
> +        if (avctx->extradata[avctx->extradata_size - 1] != '\n')
> +            avio_write(s->pb, "\r\n", 2);

Wouldn't that add a \r\n even if \n is used in this file? Or does
Aegisub write \r\n even on Unix?

>      }
> -
>      avio_flush(s->pb);
>  
>      return 0;
> @@ -191,13 +179,7 @@ static int write_packet(AVFormatContext *s, AVPacket *pkt)
>  
>  static int write_trailer(AVFormatContext *s)
>  {
> -    ASSContext *ass = s->priv_data;
> -    AVCodecContext *avctx= s->streams[0]->codec;
> -
>      purge_dialogues(s, 1);
> -    avio_write(s->pb, avctx->extradata      + ass->extra_index,
> -                      avctx->extradata_size - ass->extra_index);
> -
>      return 0;
>  }
>  



More information about the ffmpeg-devel mailing list