1cabdff1aSopenharmony_ci/*
2cabdff1aSopenharmony_ci * Common AAC and AC-3 parser
3cabdff1aSopenharmony_ci * Copyright (c) 2003 Fabrice Bellard
4cabdff1aSopenharmony_ci * Copyright (c) 2003 Michael Niedermayer
5cabdff1aSopenharmony_ci *
6cabdff1aSopenharmony_ci * This file is part of FFmpeg.
7cabdff1aSopenharmony_ci *
8cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or
9cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public
10cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either
11cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version.
12cabdff1aSopenharmony_ci *
13cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful,
14cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of
15cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16cabdff1aSopenharmony_ci * Lesser General Public License for more details.
17cabdff1aSopenharmony_ci *
18cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public
19cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software
20cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21cabdff1aSopenharmony_ci */
22cabdff1aSopenharmony_ci
23cabdff1aSopenharmony_ci#include "config_components.h"
24cabdff1aSopenharmony_ci
25cabdff1aSopenharmony_ci#include "libavutil/channel_layout.h"
26cabdff1aSopenharmony_ci#include "libavutil/common.h"
27cabdff1aSopenharmony_ci#include "parser.h"
28cabdff1aSopenharmony_ci#include "aac_ac3_parser.h"
29cabdff1aSopenharmony_ci
30cabdff1aSopenharmony_ciint ff_aac_ac3_parse(AVCodecParserContext *s1,
31cabdff1aSopenharmony_ci                     AVCodecContext *avctx,
32cabdff1aSopenharmony_ci                     const uint8_t **poutbuf, int *poutbuf_size,
33cabdff1aSopenharmony_ci                     const uint8_t *buf, int buf_size)
34cabdff1aSopenharmony_ci{
35cabdff1aSopenharmony_ci    AACAC3ParseContext *s = s1->priv_data;
36cabdff1aSopenharmony_ci    ParseContext *pc = &s->pc;
37cabdff1aSopenharmony_ci    int len, i;
38cabdff1aSopenharmony_ci    int new_frame_start;
39cabdff1aSopenharmony_ci    int got_frame = 0;
40cabdff1aSopenharmony_ci
41cabdff1aSopenharmony_ciget_next:
42cabdff1aSopenharmony_ci    i=END_NOT_FOUND;
43cabdff1aSopenharmony_ci    if(s->remaining_size <= buf_size){
44cabdff1aSopenharmony_ci        if(s->remaining_size && !s->need_next_header){
45cabdff1aSopenharmony_ci            i= s->remaining_size;
46cabdff1aSopenharmony_ci            s->remaining_size = 0;
47cabdff1aSopenharmony_ci        }else{ //we need a header first
48cabdff1aSopenharmony_ci            len=0;
49cabdff1aSopenharmony_ci            for(i=s->remaining_size; i<buf_size; i++){
50cabdff1aSopenharmony_ci                s->state = (s->state<<8) + buf[i];
51cabdff1aSopenharmony_ci                if((len=s->sync(s->state, s, &s->need_next_header, &new_frame_start)))
52cabdff1aSopenharmony_ci                    break;
53cabdff1aSopenharmony_ci            }
54cabdff1aSopenharmony_ci            if(len<=0){
55cabdff1aSopenharmony_ci                i=END_NOT_FOUND;
56cabdff1aSopenharmony_ci            }else{
57cabdff1aSopenharmony_ci                got_frame = 1;
58cabdff1aSopenharmony_ci                s->state=0;
59cabdff1aSopenharmony_ci                i-= s->header_size -1;
60cabdff1aSopenharmony_ci                s->remaining_size = len;
61cabdff1aSopenharmony_ci                if(!new_frame_start || pc->index+i<=0){
62cabdff1aSopenharmony_ci                    s->remaining_size += i;
63cabdff1aSopenharmony_ci                    goto get_next;
64cabdff1aSopenharmony_ci                }
65cabdff1aSopenharmony_ci                else if (i < 0) {
66cabdff1aSopenharmony_ci                    s->remaining_size += i;
67cabdff1aSopenharmony_ci                }
68cabdff1aSopenharmony_ci            }
69cabdff1aSopenharmony_ci        }
70cabdff1aSopenharmony_ci    }
71cabdff1aSopenharmony_ci
72cabdff1aSopenharmony_ci    if(ff_combine_frame(pc, i, &buf, &buf_size)<0){
73cabdff1aSopenharmony_ci        s->remaining_size -= FFMIN(s->remaining_size, buf_size);
74cabdff1aSopenharmony_ci        *poutbuf = NULL;
75cabdff1aSopenharmony_ci        *poutbuf_size = 0;
76cabdff1aSopenharmony_ci        return buf_size;
77cabdff1aSopenharmony_ci    }
78cabdff1aSopenharmony_ci
79cabdff1aSopenharmony_ci    *poutbuf = buf;
80cabdff1aSopenharmony_ci    *poutbuf_size = buf_size;
81cabdff1aSopenharmony_ci
82cabdff1aSopenharmony_ci    /* update codec info */
83cabdff1aSopenharmony_ci    if(s->codec_id)
84cabdff1aSopenharmony_ci        avctx->codec_id = s->codec_id;
85cabdff1aSopenharmony_ci
86cabdff1aSopenharmony_ci    if (got_frame) {
87cabdff1aSopenharmony_ci        /* Due to backwards compatible HE-AAC the sample rate, channel count,
88cabdff1aSopenharmony_ci           and total number of samples found in an AAC ADTS header are not
89cabdff1aSopenharmony_ci           reliable. Bit rate is still accurate because the total frame
90cabdff1aSopenharmony_ci           duration in seconds is still correct (as is the number of bits in
91cabdff1aSopenharmony_ci           the frame). */
92cabdff1aSopenharmony_ci        if (avctx->codec_id != AV_CODEC_ID_AAC) {
93cabdff1aSopenharmony_ci            avctx->sample_rate = s->sample_rate;
94cabdff1aSopenharmony_ci            if (!CONFIG_EAC3_DECODER || avctx->codec_id != AV_CODEC_ID_EAC3) {
95cabdff1aSopenharmony_ci                av_channel_layout_uninit(&avctx->ch_layout);
96cabdff1aSopenharmony_ci                if (s->channel_layout) {
97cabdff1aSopenharmony_ci                    av_channel_layout_from_mask(&avctx->ch_layout, s->channel_layout);
98cabdff1aSopenharmony_ci                } else {
99cabdff1aSopenharmony_ci                    avctx->ch_layout.order       = AV_CHANNEL_ORDER_UNSPEC;
100cabdff1aSopenharmony_ci                    avctx->ch_layout.nb_channels = s->channels;
101cabdff1aSopenharmony_ci                }
102cabdff1aSopenharmony_ci#if FF_API_OLD_CHANNEL_LAYOUT
103cabdff1aSopenharmony_ciFF_DISABLE_DEPRECATION_WARNINGS
104cabdff1aSopenharmony_ci                avctx->channels = avctx->ch_layout.nb_channels;
105cabdff1aSopenharmony_ci                avctx->channel_layout = s->channel_layout;
106cabdff1aSopenharmony_ciFF_ENABLE_DEPRECATION_WARNINGS
107cabdff1aSopenharmony_ci#endif
108cabdff1aSopenharmony_ci            }
109cabdff1aSopenharmony_ci            s1->duration = s->samples;
110cabdff1aSopenharmony_ci            avctx->audio_service_type = s->service_type;
111cabdff1aSopenharmony_ci        }
112cabdff1aSopenharmony_ci
113cabdff1aSopenharmony_ci        /* Calculate the average bit rate */
114cabdff1aSopenharmony_ci        s->frame_number++;
115cabdff1aSopenharmony_ci        if (!CONFIG_EAC3_DECODER || avctx->codec_id != AV_CODEC_ID_EAC3) {
116cabdff1aSopenharmony_ci            avctx->bit_rate +=
117cabdff1aSopenharmony_ci                (s->bit_rate - avctx->bit_rate) / s->frame_number;
118cabdff1aSopenharmony_ci        }
119cabdff1aSopenharmony_ci    }
120cabdff1aSopenharmony_ci
121cabdff1aSopenharmony_ci    return i;
122cabdff1aSopenharmony_ci}
123