"Fossies" - the Fresh Open Source Software Archive

Member "quicktime4linux-2.3/thirdparty/ffmpeg.053108/libavcodec/aac_ac3_parser.c" (8 Aug 2008, 2868 Bytes) of package /linux/privat/old/quicktime4linux-2.3-src.tar.gz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file.

    1 /*
    2  * Common AAC and AC3 parser
    3  * Copyright (c) 2003 Fabrice Bellard.
    4  * Copyright (c) 2003 Michael Niedermayer.
    5  *
    6  * This file is part of FFmpeg.
    7  *
    8  * FFmpeg is free software; you can redistribute it and/or
    9  * modify it under the terms of the GNU Lesser General Public
   10  * License as published by the Free Software Foundation; either
   11  * version 2.1 of the License, or (at your option) any later version.
   12  *
   13  * FFmpeg is distributed in the hope that it will be useful,
   14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
   15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   16  * Lesser General Public License for more details.
   17  *
   18  * You should have received a copy of the GNU Lesser General Public
   19  * License along with FFmpeg; if not, write to the Free Software
   20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
   21  */
   22 
   23 #include "parser.h"
   24 #include "aac_ac3_parser.h"
   25 
   26 int ff_aac_ac3_parse(AVCodecParserContext *s1,
   27                      AVCodecContext *avctx,
   28                      const uint8_t **poutbuf, int *poutbuf_size,
   29                      const uint8_t *buf, int buf_size)
   30 {
   31     AACAC3ParseContext *s = s1->priv_data;
   32     ParseContext *pc = &s->pc;
   33     int len, i;
   34     int new_frame_start;
   35 
   36 get_next:
   37     i=END_NOT_FOUND;
   38     if(s->remaining_size <= buf_size){
   39         if(s->remaining_size && !s->need_next_header){
   40             i= s->remaining_size;
   41             s->remaining_size = 0;
   42         }else{ //we need a header first
   43             len=0;
   44             for(i=s->remaining_size; i<buf_size; i++){
   45                 s->state = (s->state<<8) + buf[i];
   46                 if((len=s->sync(s->state, s, &s->need_next_header, &new_frame_start)))
   47                     break;
   48             }
   49             if(len<=0){
   50                 i=END_NOT_FOUND;
   51             }else{
   52                 i-= s->header_size -1;
   53                 s->remaining_size = len;
   54                 if(!new_frame_start){
   55                     s->remaining_size += i;
   56                     goto get_next;
   57                 }
   58             }
   59         }
   60     }
   61 
   62     if(ff_combine_frame(pc, i, &buf, &buf_size)<0){
   63         s->remaining_size -= FFMIN(s->remaining_size, buf_size);
   64         *poutbuf = NULL;
   65         *poutbuf_size = 0;
   66         return buf_size;
   67     }
   68 
   69     *poutbuf = buf;
   70     *poutbuf_size = buf_size;
   71 
   72     /* update codec info */
   73     avctx->sample_rate = s->sample_rate;
   74     /* allow downmixing to stereo (or mono for AC3) */
   75     if(avctx->request_channels > 0 &&
   76             avctx->request_channels < s->channels &&
   77             (avctx->request_channels <= 2 ||
   78             (avctx->request_channels == 1 &&
   79             avctx->codec_id == CODEC_ID_AC3))) {
   80         avctx->channels = avctx->request_channels;
   81     } else {
   82         avctx->channels = s->channels;
   83     }
   84     avctx->bit_rate = s->bit_rate;
   85     avctx->frame_size = s->samples;
   86 
   87     return i;
   88 }