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