[FFmpeg-cvslog] r12894 - in trunk/libavcodec: aac_ac3_parser.c aac_ac3_parser.h aac_parser.c ac3_parser.c

Janne Grunau janne-ffmpeg
Sun Oct 5 23:19:16 CEST 2008


On Saturday 19 April 2008 03:50:41 michael wrote:
> Author: michael
> Date: Sat Apr 19 03:50:40 2008
> New Revision: 12894
>
> Log:
> Change aac and ac3 parsers to use ff_combine_frame().

This changeset breaks also parsing of AAC in mpeg-ts. The file plays
without audio. I can upload a sample but it's just generated by
libfaac-enabled ffmpeg with -f mpegts -acodec libfaac.

ffmpeg output appended, the svn revision in the version is wrong,
might be caused by out of tree builds.

Janne


[janne at aniel samples_mpeg2]\$ /dev/shm/ffmpeg/12893/ffmpeg -i aac_test.mpg
FFmpeg version SVN-r12659, Copyright (c) 2000-2008 Fabrice Bellard, et al.
  
configuration: --enable-gpl --cpu=nocona --enable-pthreads --disable-network --disable-ffserver --enable-libfaac
  libavutil version: 49.6.0
  libavcodec version: 51.55.0
  libavformat version: 52.13.0
  libavdevice version: 52.0.0
  built on Oct  5 2008 22:52:04, gcc: 4.3.0 20080428 (Red Hat 4.3.0-8)
Input #0, mpegts, from 'aac_test.mpg':
  Duration: 00:00:13.35, start: 0.000000, bitrate: 13489 kb/s
  Program 1 Service01
    Stream #0.0[0x100]: Video: mpeg2video, yuv420p, 1920x1080 [PAR 1:1 DAR 16:9], 25000 kb/s, 29.97 tb(r)
    Stream #0.1[0x101]: Audio: mpeg4aac, 48000 Hz, 5:1, 236 kb/s
Must supply at least one output file

[janne at aniel samples_mpeg2]\$ /dev/shm/ffmpeg/12894/ffmpeg -i aac_test.mpg
FFmpeg version SVN-r12659, Copyright (c) 2000-2008 Fabrice Bellard, et al.
  
configuration: --enable-gpl --cpu=nocona --enable-pthreads --disable-network --disable-ffserver --enable-libfaac
  libavutil version: 49.6.0
  libavcodec version: 51.55.0
  libavformat version: 52.13.0
  libavdevice version: 52.0.0
  built on Oct  5 2008 23:02:58, gcc: 4.3.0 20080428 (Red Hat 4.3.0-8)
Input #0, mpegts, from 'aac_test.mpg':
  Duration: N/A, start: 0.033367, bitrate: N/A
  Program 1 Service01
    Stream #0.0[0x100]: Video: mpeg2video, yuv420p, 1920x1080 [PAR 1:1 DAR 16:9], 25000 kb/s, 29.97 tb(r)
    Stream #0.1[0x101]: Audio: mpeg4aac
Must supply at least one output file
>
>
> Modified:
>    trunk/libavcodec/aac_ac3_parser.c
>    trunk/libavcodec/aac_ac3_parser.h
>    trunk/libavcodec/aac_parser.c
>    trunk/libavcodec/ac3_parser.c
>
> Modified: trunk/libavcodec/aac_ac3_parser.c
> =====================================================================
>========= --- trunk/libavcodec/aac_ac3_parser.c	(original)
> +++ trunk/libavcodec/aac_ac3_parser.c	Sat Apr 19 03:50:40 2008
> @@ -29,34 +29,40 @@ int ff_aac_ac3_parse(AVCodecParserContex
>                       const uint8_t *buf, int buf_size)
>  {
>      AACAC3ParseContext *s = s1->priv_data;
> -    const uint8_t *buf_ptr;
> -    int len;
> +    ParseContext *pc = &s->pc;
> +    int len, i;
>
> -    *poutbuf = NULL;
> -    *poutbuf_size = 0;
> +    i=END_NOT_FOUND;
> +    if(s->remaining_size <= buf_size){
> +        if(s->remaining_size){
> +            i= s->remaining_size;
> +            s->remaining_size = 0;
> +        }else{ //we need a header first
> +            len=0;
> +            for(i=s->remaining_size; i<buf_size; i++){
> +                s->state = (s->state<<8) + buf[i];
> +                if((len=s->sync(s->state, s)))
> +                    break;
> +            }
> +            if(len<=0){
> +                i=END_NOT_FOUND;
> +            }else{
> +                i-= s->header_size -1;
> +                s->remaining_size = len + i;
> +            }
> +        }
> +    }
>
> -    buf_ptr = buf;
> -    while (buf_size > 0) {
> -        int size_needed= s->frame_size ? s->frame_size :
> s->header_size; -        len = s->inbuf_ptr - s->inbuf;
> +    if(ff_combine_frame(pc, i, &buf, &buf_size)<0){
> +        s->remaining_size -= FFMIN(s->remaining_size, buf_size);
> +        *poutbuf = NULL;
> +        *poutbuf_size = 0;
> +        return buf_size;
> +    }
>
> -        if(len<size_needed){
> -            len = FFMIN(size_needed - len, buf_size);
> -            memcpy(s->inbuf_ptr, buf_ptr, len);
> -            buf_ptr      += len;
> -            s->inbuf_ptr += len;
> -            buf_size     -= len;
> -        }
> +    *poutbuf = buf;
> +    *poutbuf_size = buf_size;
>
> -        if (s->frame_size == 0) {
> -            if ((s->inbuf_ptr - s->inbuf) == s->header_size) {
> -                len = s->sync(s);
> -                if (len == 0) {
> -                    /* no sync found : move by one byte
> (inefficient, but simple!) */ -                    memmove(s->inbuf,
> s->inbuf + 1, s->header_size - 1); -                   
> s->inbuf_ptr--;
> -                } else {
> -                    s->frame_size = len;
>                      /* update codec info */
>                      avctx->sample_rate = s->sample_rate;
>                      /* allow downmixing to stereo (or mono for AC3)
> */ @@ -71,17 +77,6 @@ int ff_aac_ac3_parse(AVCodecParserContex
>                      }
>                      avctx->bit_rate = s->bit_rate;
>                      avctx->frame_size = s->samples;
> -                }
> -            }
> -        } else {
> -            if(s->inbuf_ptr - s->inbuf == s->frame_size){
> -                *poutbuf = s->inbuf;
> -                *poutbuf_size = s->frame_size;
> -                s->inbuf_ptr = s->inbuf;
> -                s->frame_size = 0;
> -                break;
> -            }
> -        }
> -    }
> -    return buf_ptr - buf;
> +
> +    return i;
>  }
>
> Modified: trunk/libavcodec/aac_ac3_parser.h
> =====================================================================
>========= --- trunk/libavcodec/aac_ac3_parser.h	(original)
> +++ trunk/libavcodec/aac_ac3_parser.h	Sat Apr 19 03:50:40 2008
> @@ -27,16 +27,18 @@
>  #include "avcodec.h"
>
>  typedef struct AACAC3ParseContext {
> -    uint8_t *inbuf_ptr;
>      int frame_size;
>      int header_size;
> -    int (*sync)(struct AACAC3ParseContext *hdr_info);
> -    uint8_t inbuf[8192]; /* input buffer */
> +    int (*sync)(uint64_t state, struct AACAC3ParseContext
> *hdr_info);
>
>      int channels;
>      int sample_rate;
>      int bit_rate;
>      int samples;
> +
> +    ParseContext pc;
> +    int remaining_size;
> +    uint64_t state;
>  } AACAC3ParseContext;
>
>  int ff_aac_ac3_parse(AVCodecParserContext *s1,
>
> Modified: trunk/libavcodec/aac_parser.c
> =====================================================================
>========= --- trunk/libavcodec/aac_parser.c	(original)
> +++ trunk/libavcodec/aac_parser.c	Sat Apr 19 03:50:40 2008
> @@ -27,12 +27,13 @@
>
>  #define AAC_HEADER_SIZE 7
>
> -static int aac_sync(AACAC3ParseContext *hdr_info)
> +static int aac_sync(uint64_t state, AACAC3ParseContext *hdr_info)
>  {
>      GetBitContext bits;
>      int size, rdb, ch, sr;
> +    uint64_t tmp = be2me_64(state);
>
> -    init_get_bits(&bits, hdr_info->inbuf, AAC_HEADER_SIZE * 8);
> +    init_get_bits(&bits, ((uint8_t *)&tmp)+8-AAC_HEADER_SIZE,
> AAC_HEADER_SIZE * 8);
>
>      if(get_bits(&bits, 12) != 0xfff)
>          return 0;
> @@ -72,7 +73,6 @@ static int aac_sync(AACAC3ParseContext *
>  static av_cold int aac_parse_init(AVCodecParserContext *s1)
>  {
>      AACAC3ParseContext *s = s1->priv_data;
> -    s->inbuf_ptr = s->inbuf;
>      s->header_size = AAC_HEADER_SIZE;
>      s->sync = aac_sync;
>      return 0;
>
> Modified: trunk/libavcodec/ac3_parser.c
> =====================================================================
>========= --- trunk/libavcodec/ac3_parser.c	(original)
> +++ trunk/libavcodec/ac3_parser.c	Sat Apr 19 03:50:40 2008
> @@ -123,12 +123,13 @@ int ff_ac3_parse_header(const uint8_t bu
>      return 0;
>  }
>
> -static int ac3_sync(AACAC3ParseContext *hdr_info)
> +static int ac3_sync(uint64_t state, AACAC3ParseContext *hdr_info)
>  {
>      int err;
> +    uint64_t tmp = be2me_64(state);
>      AC3HeaderInfo hdr;
>
> -    err = ff_ac3_parse_header(hdr_info->inbuf, &hdr);
> +    err = ff_ac3_parse_header(((uint8_t *)&tmp)+8-AC3_HEADER_SIZE,
> &hdr);
>
>      if(err < 0)
>          return 0;
> @@ -144,7 +145,6 @@ static int ac3_sync(AACAC3ParseContext *
>  static av_cold int ac3_parse_init(AVCodecParserContext *s1)
>  {
>      AACAC3ParseContext *s = s1->priv_data;
> -    s->inbuf_ptr = s->inbuf;
>      s->header_size = AC3_HEADER_SIZE;
>      s->sync = ac3_sync;
>      return 0;
> _______________________________________________
> ffmpeg-cvslog mailing list
> ffmpeg-cvslog at mplayerhq.hu
> https://lists.mplayerhq.hu/mailman/listinfo/ffmpeg-cvslog




More information about the ffmpeg-cvslog mailing list