annotate aac_ac3_parser.c @ 5875:5a61e8e2f65c libavcodec

Remove libvorbis Vorbis decoding support. Our native decoder is complete and has no known bugs, any remaining issues will hopefully be uncovered now.
author diego
date Sun, 04 Nov 2007 12:55:32 +0000
parents 0168cd384df3
children a5dee59b5918
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4941
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
1 /*
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
2 * Common AAC and AC3 parser
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
3 * Copyright (c) 2003 Fabrice Bellard.
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
4 * Copyright (c) 2003 Michael Niedermayer.
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
5 *
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
6 * This file is part of FFmpeg.
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
7 *
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
8 * FFmpeg is free software; you can redistribute it and/or
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
9 * modify it under the terms of the GNU Lesser General Public
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
10 * License as published by the Free Software Foundation; either
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
11 * version 2.1 of the License, or (at your option) any later version.
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
12 *
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
13 * FFmpeg is distributed in the hope that it will be useful,
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
16 * Lesser General Public License for more details.
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
17 *
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
18 * You should have received a copy of the GNU Lesser General Public
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
19 * License along with FFmpeg; if not, write to the Free Software
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
21 */
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
22
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
23 #include "parser.h"
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
24 #include "aac_ac3_parser.h"
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
25
4942
b42e963c8149 cosmetics: rename for consistency after previous aac and ac3 parsers move
aurel
parents: 4941
diff changeset
26 int ff_aac_ac3_parse(AVCodecParserContext *s1,
4941
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
27 AVCodecContext *avctx,
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
28 const uint8_t **poutbuf, int *poutbuf_size,
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
29 const uint8_t *buf, int buf_size)
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
30 {
4942
b42e963c8149 cosmetics: rename for consistency after previous aac and ac3 parsers move
aurel
parents: 4941
diff changeset
31 AACAC3ParseContext *s = s1->priv_data;
4941
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
32 const uint8_t *buf_ptr;
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
33 int len, sample_rate, bit_rate, channels, samples;
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
34
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
35 *poutbuf = NULL;
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
36 *poutbuf_size = 0;
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
37
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
38 buf_ptr = buf;
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
39 while (buf_size > 0) {
5816
0168cd384df3 factorize code and add safety check to prevent memcpying negative amounts
michael
parents: 4942
diff changeset
40 int size_needed= s->frame_size ? s->frame_size : s->header_size;
4941
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
41 len = s->inbuf_ptr - s->inbuf;
5816
0168cd384df3 factorize code and add safety check to prevent memcpying negative amounts
michael
parents: 4942
diff changeset
42
0168cd384df3 factorize code and add safety check to prevent memcpying negative amounts
michael
parents: 4942
diff changeset
43 if(len<size_needed){
0168cd384df3 factorize code and add safety check to prevent memcpying negative amounts
michael
parents: 4942
diff changeset
44 len = FFMIN(size_needed - len, buf_size);
0168cd384df3 factorize code and add safety check to prevent memcpying negative amounts
michael
parents: 4942
diff changeset
45 memcpy(s->inbuf_ptr, buf_ptr, len);
0168cd384df3 factorize code and add safety check to prevent memcpying negative amounts
michael
parents: 4942
diff changeset
46 buf_ptr += len;
0168cd384df3 factorize code and add safety check to prevent memcpying negative amounts
michael
parents: 4942
diff changeset
47 s->inbuf_ptr += len;
0168cd384df3 factorize code and add safety check to prevent memcpying negative amounts
michael
parents: 4942
diff changeset
48 buf_size -= len;
0168cd384df3 factorize code and add safety check to prevent memcpying negative amounts
michael
parents: 4942
diff changeset
49 }
0168cd384df3 factorize code and add safety check to prevent memcpying negative amounts
michael
parents: 4942
diff changeset
50
4941
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
51 if (s->frame_size == 0) {
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
52 if ((s->inbuf_ptr - s->inbuf) == s->header_size) {
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
53 len = s->sync(s->inbuf, &channels, &sample_rate, &bit_rate,
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
54 &samples);
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
55 if (len == 0) {
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
56 /* no sync found : move by one byte (inefficient, but simple!) */
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
57 memmove(s->inbuf, s->inbuf + 1, s->header_size - 1);
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
58 s->inbuf_ptr--;
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
59 } else {
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
60 s->frame_size = len;
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
61 /* update codec info */
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
62 avctx->sample_rate = sample_rate;
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
63 /* set channels,except if the user explicitly requests 1 or 2 channels, XXX/FIXME this is a bit ugly */
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
64 if(avctx->codec_id == CODEC_ID_AC3){
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
65 if(avctx->channels!=1 && avctx->channels!=2){
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
66 avctx->channels = channels;
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
67 }
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
68 } else {
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
69 avctx->channels = channels;
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
70 }
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
71 avctx->bit_rate = bit_rate;
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
72 avctx->frame_size = samples;
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
73 }
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
74 }
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
75 } else {
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
76 if(s->inbuf_ptr - s->inbuf == s->frame_size){
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
77 *poutbuf = s->inbuf;
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
78 *poutbuf_size = s->frame_size;
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
79 s->inbuf_ptr = s->inbuf;
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
80 s->frame_size = 0;
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
81 break;
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
82 }
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
83 }
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
84 }
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
85 return buf_ptr - buf;
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
86 }