[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