1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * DCA parser 3cabdff1aSopenharmony_ci * Copyright (C) 2004 Gildas Bazin 4cabdff1aSopenharmony_ci * Copyright (C) 2004 Benjamin Zores 5cabdff1aSopenharmony_ci * Copyright (C) 2006 Benjamin Larsson 6cabdff1aSopenharmony_ci * Copyright (C) 2007 Konstantin Shishkov 7cabdff1aSopenharmony_ci * 8cabdff1aSopenharmony_ci * This file is part of FFmpeg. 9cabdff1aSopenharmony_ci * 10cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 11cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 12cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 13cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 14cabdff1aSopenharmony_ci * 15cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 16cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 17cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 18cabdff1aSopenharmony_ci * Lesser General Public License for more details. 19cabdff1aSopenharmony_ci * 20cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 21cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 22cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 23cabdff1aSopenharmony_ci */ 24cabdff1aSopenharmony_ci 25cabdff1aSopenharmony_ci#include "dca.h" 26cabdff1aSopenharmony_ci#include "dca_core.h" 27cabdff1aSopenharmony_ci#include "dca_exss.h" 28cabdff1aSopenharmony_ci#include "dca_lbr.h" 29cabdff1aSopenharmony_ci#include "dca_syncwords.h" 30cabdff1aSopenharmony_ci#include "get_bits.h" 31cabdff1aSopenharmony_ci#include "parser.h" 32cabdff1aSopenharmony_ci 33cabdff1aSopenharmony_citypedef struct DCAParseContext { 34cabdff1aSopenharmony_ci ParseContext pc; 35cabdff1aSopenharmony_ci uint32_t lastmarker; 36cabdff1aSopenharmony_ci int size; 37cabdff1aSopenharmony_ci int framesize; 38cabdff1aSopenharmony_ci unsigned int startpos; 39cabdff1aSopenharmony_ci DCAExssParser exss; 40cabdff1aSopenharmony_ci unsigned int sr_code; 41cabdff1aSopenharmony_ci} DCAParseContext; 42cabdff1aSopenharmony_ci 43cabdff1aSopenharmony_ci#define IS_CORE_MARKER(state) \ 44cabdff1aSopenharmony_ci (((state & 0xFFFFFFFFF0FF) == (((uint64_t)DCA_SYNCWORD_CORE_14B_LE << 16) | 0xF007)) || \ 45cabdff1aSopenharmony_ci ((state & 0xFFFFFFFFFFF0) == (((uint64_t)DCA_SYNCWORD_CORE_14B_BE << 16) | 0x07F0)) || \ 46cabdff1aSopenharmony_ci ((state & 0xFFFFFFFF00FC) == (((uint64_t)DCA_SYNCWORD_CORE_LE << 16) | 0x00FC)) || \ 47cabdff1aSopenharmony_ci ((state & 0xFFFFFFFFFC00) == (((uint64_t)DCA_SYNCWORD_CORE_BE << 16) | 0xFC00))) 48cabdff1aSopenharmony_ci 49cabdff1aSopenharmony_ci#define IS_EXSS_MARKER(state) ((state & 0xFFFFFFFF) == DCA_SYNCWORD_SUBSTREAM) 50cabdff1aSopenharmony_ci 51cabdff1aSopenharmony_ci#define IS_MARKER(state) (IS_CORE_MARKER(state) || IS_EXSS_MARKER(state)) 52cabdff1aSopenharmony_ci 53cabdff1aSopenharmony_ci#define CORE_MARKER(state) ((state >> 16) & 0xFFFFFFFF) 54cabdff1aSopenharmony_ci#define EXSS_MARKER(state) (state & 0xFFFFFFFF) 55cabdff1aSopenharmony_ci 56cabdff1aSopenharmony_ci#define STATE_LE(state) (((state & 0xFF00FF00) >> 8) | ((state & 0x00FF00FF) << 8)) 57cabdff1aSopenharmony_ci#define STATE_14(state) (((state & 0x3FFF0000) >> 8) | ((state & 0x00003FFF) >> 6)) 58cabdff1aSopenharmony_ci 59cabdff1aSopenharmony_ci#define CORE_FRAMESIZE(state) (((state >> 4) & 0x3FFF) + 1) 60cabdff1aSopenharmony_ci#define EXSS_FRAMESIZE(state) ((state & 0x2000000000) ? \ 61cabdff1aSopenharmony_ci ((state >> 5) & 0xFFFFF) + 1 : \ 62cabdff1aSopenharmony_ci ((state >> 13) & 0x0FFFF) + 1) 63cabdff1aSopenharmony_ci 64cabdff1aSopenharmony_ci/** 65cabdff1aSopenharmony_ci * Find the end of the current frame in the bitstream. 66cabdff1aSopenharmony_ci * @return the position of the first byte of the next frame, or -1 67cabdff1aSopenharmony_ci */ 68cabdff1aSopenharmony_cistatic int dca_find_frame_end(DCAParseContext *pc1, const uint8_t *buf, 69cabdff1aSopenharmony_ci int buf_size) 70cabdff1aSopenharmony_ci{ 71cabdff1aSopenharmony_ci int start_found, size, i; 72cabdff1aSopenharmony_ci uint64_t state; 73cabdff1aSopenharmony_ci ParseContext *pc = &pc1->pc; 74cabdff1aSopenharmony_ci 75cabdff1aSopenharmony_ci start_found = pc->frame_start_found; 76cabdff1aSopenharmony_ci state = pc->state64; 77cabdff1aSopenharmony_ci size = pc1->size; 78cabdff1aSopenharmony_ci 79cabdff1aSopenharmony_ci i = 0; 80cabdff1aSopenharmony_ci if (!start_found) { 81cabdff1aSopenharmony_ci for (; i < buf_size; i++) { 82cabdff1aSopenharmony_ci size++; 83cabdff1aSopenharmony_ci state = (state << 8) | buf[i]; 84cabdff1aSopenharmony_ci 85cabdff1aSopenharmony_ci if (IS_MARKER(state) && 86cabdff1aSopenharmony_ci (!pc1->lastmarker || 87cabdff1aSopenharmony_ci pc1->lastmarker == CORE_MARKER(state) || 88cabdff1aSopenharmony_ci pc1->lastmarker == DCA_SYNCWORD_SUBSTREAM)) { 89cabdff1aSopenharmony_ci if (!pc1->lastmarker) 90cabdff1aSopenharmony_ci pc1->startpos = IS_EXSS_MARKER(state) ? size - 4 : size - 6; 91cabdff1aSopenharmony_ci 92cabdff1aSopenharmony_ci if (IS_EXSS_MARKER(state)) 93cabdff1aSopenharmony_ci pc1->lastmarker = EXSS_MARKER(state); 94cabdff1aSopenharmony_ci else 95cabdff1aSopenharmony_ci pc1->lastmarker = CORE_MARKER(state); 96cabdff1aSopenharmony_ci 97cabdff1aSopenharmony_ci start_found = 1; 98cabdff1aSopenharmony_ci size = 0; 99cabdff1aSopenharmony_ci 100cabdff1aSopenharmony_ci i++; 101cabdff1aSopenharmony_ci break; 102cabdff1aSopenharmony_ci } 103cabdff1aSopenharmony_ci } 104cabdff1aSopenharmony_ci } 105cabdff1aSopenharmony_ci 106cabdff1aSopenharmony_ci if (start_found) { 107cabdff1aSopenharmony_ci for (; i < buf_size; i++) { 108cabdff1aSopenharmony_ci size++; 109cabdff1aSopenharmony_ci state = (state << 8) | buf[i]; 110cabdff1aSopenharmony_ci 111cabdff1aSopenharmony_ci if (start_found == 1) { 112cabdff1aSopenharmony_ci switch (pc1->lastmarker) { 113cabdff1aSopenharmony_ci case DCA_SYNCWORD_CORE_BE: 114cabdff1aSopenharmony_ci if (size == 2) { 115cabdff1aSopenharmony_ci pc1->framesize = CORE_FRAMESIZE(state); 116cabdff1aSopenharmony_ci start_found = 2; 117cabdff1aSopenharmony_ci } 118cabdff1aSopenharmony_ci break; 119cabdff1aSopenharmony_ci case DCA_SYNCWORD_CORE_LE: 120cabdff1aSopenharmony_ci if (size == 2) { 121cabdff1aSopenharmony_ci pc1->framesize = CORE_FRAMESIZE(STATE_LE(state)); 122cabdff1aSopenharmony_ci start_found = 4; 123cabdff1aSopenharmony_ci } 124cabdff1aSopenharmony_ci break; 125cabdff1aSopenharmony_ci case DCA_SYNCWORD_CORE_14B_BE: 126cabdff1aSopenharmony_ci if (size == 4) { 127cabdff1aSopenharmony_ci pc1->framesize = CORE_FRAMESIZE(STATE_14(state)); 128cabdff1aSopenharmony_ci start_found = 4; 129cabdff1aSopenharmony_ci } 130cabdff1aSopenharmony_ci break; 131cabdff1aSopenharmony_ci case DCA_SYNCWORD_CORE_14B_LE: 132cabdff1aSopenharmony_ci if (size == 4) { 133cabdff1aSopenharmony_ci pc1->framesize = CORE_FRAMESIZE(STATE_14(STATE_LE(state))); 134cabdff1aSopenharmony_ci start_found = 4; 135cabdff1aSopenharmony_ci } 136cabdff1aSopenharmony_ci break; 137cabdff1aSopenharmony_ci case DCA_SYNCWORD_SUBSTREAM: 138cabdff1aSopenharmony_ci if (size == 6) { 139cabdff1aSopenharmony_ci pc1->framesize = EXSS_FRAMESIZE(state); 140cabdff1aSopenharmony_ci start_found = 4; 141cabdff1aSopenharmony_ci } 142cabdff1aSopenharmony_ci break; 143cabdff1aSopenharmony_ci default: 144cabdff1aSopenharmony_ci av_assert0(0); 145cabdff1aSopenharmony_ci } 146cabdff1aSopenharmony_ci continue; 147cabdff1aSopenharmony_ci } 148cabdff1aSopenharmony_ci 149cabdff1aSopenharmony_ci if (start_found == 2 && IS_EXSS_MARKER(state) && 150cabdff1aSopenharmony_ci pc1->framesize <= size + 2) { 151cabdff1aSopenharmony_ci pc1->framesize = size + 2; 152cabdff1aSopenharmony_ci start_found = 3; 153cabdff1aSopenharmony_ci continue; 154cabdff1aSopenharmony_ci } 155cabdff1aSopenharmony_ci 156cabdff1aSopenharmony_ci if (start_found == 3) { 157cabdff1aSopenharmony_ci if (size == pc1->framesize + 4) { 158cabdff1aSopenharmony_ci pc1->framesize += EXSS_FRAMESIZE(state); 159cabdff1aSopenharmony_ci start_found = 4; 160cabdff1aSopenharmony_ci } 161cabdff1aSopenharmony_ci continue; 162cabdff1aSopenharmony_ci } 163cabdff1aSopenharmony_ci 164cabdff1aSopenharmony_ci if (pc1->framesize > size) 165cabdff1aSopenharmony_ci continue; 166cabdff1aSopenharmony_ci 167cabdff1aSopenharmony_ci if (IS_MARKER(state) && 168cabdff1aSopenharmony_ci (pc1->lastmarker == CORE_MARKER(state) || 169cabdff1aSopenharmony_ci pc1->lastmarker == DCA_SYNCWORD_SUBSTREAM)) { 170cabdff1aSopenharmony_ci pc->frame_start_found = 0; 171cabdff1aSopenharmony_ci pc->state64 = -1; 172cabdff1aSopenharmony_ci pc1->size = 0; 173cabdff1aSopenharmony_ci return IS_EXSS_MARKER(state) ? i - 3 : i - 5; 174cabdff1aSopenharmony_ci } 175cabdff1aSopenharmony_ci } 176cabdff1aSopenharmony_ci } 177cabdff1aSopenharmony_ci 178cabdff1aSopenharmony_ci pc->frame_start_found = start_found; 179cabdff1aSopenharmony_ci pc->state64 = state; 180cabdff1aSopenharmony_ci pc1->size = size; 181cabdff1aSopenharmony_ci return END_NOT_FOUND; 182cabdff1aSopenharmony_ci} 183cabdff1aSopenharmony_ci 184cabdff1aSopenharmony_cistatic av_cold int dca_parse_init(AVCodecParserContext *s) 185cabdff1aSopenharmony_ci{ 186cabdff1aSopenharmony_ci DCAParseContext *pc1 = s->priv_data; 187cabdff1aSopenharmony_ci 188cabdff1aSopenharmony_ci pc1->lastmarker = 0; 189cabdff1aSopenharmony_ci pc1->sr_code = -1; 190cabdff1aSopenharmony_ci return 0; 191cabdff1aSopenharmony_ci} 192cabdff1aSopenharmony_ci 193cabdff1aSopenharmony_cistatic int dca_parse_params(DCAParseContext *pc1, const uint8_t *buf, 194cabdff1aSopenharmony_ci int buf_size, int *duration, int *sample_rate, 195cabdff1aSopenharmony_ci int *profile) 196cabdff1aSopenharmony_ci{ 197cabdff1aSopenharmony_ci DCAExssAsset *asset = &pc1->exss.assets[0]; 198cabdff1aSopenharmony_ci GetBitContext gb; 199cabdff1aSopenharmony_ci DCACoreFrameHeader h; 200cabdff1aSopenharmony_ci uint8_t hdr[DCA_CORE_FRAME_HEADER_SIZE + AV_INPUT_BUFFER_PADDING_SIZE] = { 0 }; 201cabdff1aSopenharmony_ci int ret, frame_size; 202cabdff1aSopenharmony_ci 203cabdff1aSopenharmony_ci if (buf_size < DCA_CORE_FRAME_HEADER_SIZE) 204cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 205cabdff1aSopenharmony_ci 206cabdff1aSopenharmony_ci if (AV_RB32(buf) == DCA_SYNCWORD_SUBSTREAM) { 207cabdff1aSopenharmony_ci if ((ret = ff_dca_exss_parse(&pc1->exss, buf, buf_size)) < 0) 208cabdff1aSopenharmony_ci return ret; 209cabdff1aSopenharmony_ci 210cabdff1aSopenharmony_ci if (asset->extension_mask & DCA_EXSS_LBR) { 211cabdff1aSopenharmony_ci if ((ret = init_get_bits8(&gb, buf + asset->lbr_offset, asset->lbr_size)) < 0) 212cabdff1aSopenharmony_ci return ret; 213cabdff1aSopenharmony_ci 214cabdff1aSopenharmony_ci if (get_bits_long(&gb, 32) != DCA_SYNCWORD_LBR) 215cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 216cabdff1aSopenharmony_ci 217cabdff1aSopenharmony_ci switch (get_bits(&gb, 8)) { 218cabdff1aSopenharmony_ci case DCA_LBR_HEADER_DECODER_INIT: 219cabdff1aSopenharmony_ci pc1->sr_code = get_bits(&gb, 8); 220cabdff1aSopenharmony_ci case DCA_LBR_HEADER_SYNC_ONLY: 221cabdff1aSopenharmony_ci break; 222cabdff1aSopenharmony_ci default: 223cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 224cabdff1aSopenharmony_ci } 225cabdff1aSopenharmony_ci 226cabdff1aSopenharmony_ci if (pc1->sr_code >= FF_ARRAY_ELEMS(ff_dca_sampling_freqs)) 227cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 228cabdff1aSopenharmony_ci 229cabdff1aSopenharmony_ci *sample_rate = ff_dca_sampling_freqs[pc1->sr_code]; 230cabdff1aSopenharmony_ci *duration = 1024 << ff_dca_freq_ranges[pc1->sr_code]; 231cabdff1aSopenharmony_ci *profile = FF_PROFILE_DTS_EXPRESS; 232cabdff1aSopenharmony_ci return 0; 233cabdff1aSopenharmony_ci } 234cabdff1aSopenharmony_ci 235cabdff1aSopenharmony_ci if (asset->extension_mask & DCA_EXSS_XLL) { 236cabdff1aSopenharmony_ci int nsamples_log2; 237cabdff1aSopenharmony_ci 238cabdff1aSopenharmony_ci if ((ret = init_get_bits8(&gb, buf + asset->xll_offset, asset->xll_size)) < 0) 239cabdff1aSopenharmony_ci return ret; 240cabdff1aSopenharmony_ci 241cabdff1aSopenharmony_ci if (get_bits_long(&gb, 32) != DCA_SYNCWORD_XLL) 242cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 243cabdff1aSopenharmony_ci 244cabdff1aSopenharmony_ci if (get_bits(&gb, 4)) 245cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 246cabdff1aSopenharmony_ci 247cabdff1aSopenharmony_ci skip_bits(&gb, 8); 248cabdff1aSopenharmony_ci skip_bits_long(&gb, get_bits(&gb, 5) + 1); 249cabdff1aSopenharmony_ci skip_bits(&gb, 4); 250cabdff1aSopenharmony_ci nsamples_log2 = get_bits(&gb, 4) + get_bits(&gb, 4); 251cabdff1aSopenharmony_ci if (nsamples_log2 > 24) 252cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 253cabdff1aSopenharmony_ci 254cabdff1aSopenharmony_ci *sample_rate = asset->max_sample_rate; 255cabdff1aSopenharmony_ci *duration = (1 + (*sample_rate > 96000)) << nsamples_log2; 256cabdff1aSopenharmony_ci *profile = FF_PROFILE_DTS_HD_MA; 257cabdff1aSopenharmony_ci return 0; 258cabdff1aSopenharmony_ci } 259cabdff1aSopenharmony_ci 260cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 261cabdff1aSopenharmony_ci } 262cabdff1aSopenharmony_ci 263cabdff1aSopenharmony_ci if ((ret = avpriv_dca_convert_bitstream(buf, DCA_CORE_FRAME_HEADER_SIZE, 264cabdff1aSopenharmony_ci hdr, DCA_CORE_FRAME_HEADER_SIZE)) < 0) 265cabdff1aSopenharmony_ci return ret; 266cabdff1aSopenharmony_ci if (avpriv_dca_parse_core_frame_header(&h, hdr, ret) < 0) 267cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 268cabdff1aSopenharmony_ci 269cabdff1aSopenharmony_ci *duration = h.npcmblocks * DCA_PCMBLOCK_SAMPLES; 270cabdff1aSopenharmony_ci *sample_rate = ff_dca_sample_rates[h.sr_code]; 271cabdff1aSopenharmony_ci if (*profile != FF_PROFILE_UNKNOWN) 272cabdff1aSopenharmony_ci return 0; 273cabdff1aSopenharmony_ci 274cabdff1aSopenharmony_ci *profile = FF_PROFILE_DTS; 275cabdff1aSopenharmony_ci if (h.ext_audio_present) { 276cabdff1aSopenharmony_ci switch (h.ext_audio_type) { 277cabdff1aSopenharmony_ci case DCA_EXT_AUDIO_XCH: 278cabdff1aSopenharmony_ci case DCA_EXT_AUDIO_XXCH: 279cabdff1aSopenharmony_ci *profile = FF_PROFILE_DTS_ES; 280cabdff1aSopenharmony_ci break; 281cabdff1aSopenharmony_ci case DCA_EXT_AUDIO_X96: 282cabdff1aSopenharmony_ci *profile = FF_PROFILE_DTS_96_24; 283cabdff1aSopenharmony_ci break; 284cabdff1aSopenharmony_ci } 285cabdff1aSopenharmony_ci } 286cabdff1aSopenharmony_ci 287cabdff1aSopenharmony_ci frame_size = FFALIGN(h.frame_size, 4); 288cabdff1aSopenharmony_ci if (buf_size - 4 < frame_size) 289cabdff1aSopenharmony_ci return 0; 290cabdff1aSopenharmony_ci 291cabdff1aSopenharmony_ci buf += frame_size; 292cabdff1aSopenharmony_ci buf_size -= frame_size; 293cabdff1aSopenharmony_ci if (AV_RB32(buf) != DCA_SYNCWORD_SUBSTREAM) 294cabdff1aSopenharmony_ci return 0; 295cabdff1aSopenharmony_ci if (ff_dca_exss_parse(&pc1->exss, buf, buf_size) < 0) 296cabdff1aSopenharmony_ci return 0; 297cabdff1aSopenharmony_ci 298cabdff1aSopenharmony_ci if (asset->extension_mask & DCA_EXSS_XLL) 299cabdff1aSopenharmony_ci *profile = FF_PROFILE_DTS_HD_MA; 300cabdff1aSopenharmony_ci else if (asset->extension_mask & (DCA_EXSS_XBR | DCA_EXSS_XXCH | DCA_EXSS_X96)) 301cabdff1aSopenharmony_ci *profile = FF_PROFILE_DTS_HD_HRA; 302cabdff1aSopenharmony_ci 303cabdff1aSopenharmony_ci return 0; 304cabdff1aSopenharmony_ci} 305cabdff1aSopenharmony_ci 306cabdff1aSopenharmony_cistatic int dca_parse(AVCodecParserContext *s, AVCodecContext *avctx, 307cabdff1aSopenharmony_ci const uint8_t **poutbuf, int *poutbuf_size, 308cabdff1aSopenharmony_ci const uint8_t *buf, int buf_size) 309cabdff1aSopenharmony_ci{ 310cabdff1aSopenharmony_ci DCAParseContext *pc1 = s->priv_data; 311cabdff1aSopenharmony_ci ParseContext *pc = &pc1->pc; 312cabdff1aSopenharmony_ci int next, duration, sample_rate; 313cabdff1aSopenharmony_ci 314cabdff1aSopenharmony_ci if (s->flags & PARSER_FLAG_COMPLETE_FRAMES) { 315cabdff1aSopenharmony_ci next = buf_size; 316cabdff1aSopenharmony_ci } else { 317cabdff1aSopenharmony_ci next = dca_find_frame_end(pc1, buf, buf_size); 318cabdff1aSopenharmony_ci 319cabdff1aSopenharmony_ci if (ff_combine_frame(pc, next, &buf, &buf_size) < 0) { 320cabdff1aSopenharmony_ci *poutbuf = NULL; 321cabdff1aSopenharmony_ci *poutbuf_size = 0; 322cabdff1aSopenharmony_ci return buf_size; 323cabdff1aSopenharmony_ci } 324cabdff1aSopenharmony_ci 325cabdff1aSopenharmony_ci /* skip initial padding */ 326cabdff1aSopenharmony_ci if (buf_size > pc1->startpos) { 327cabdff1aSopenharmony_ci buf += pc1->startpos; 328cabdff1aSopenharmony_ci buf_size -= pc1->startpos; 329cabdff1aSopenharmony_ci } 330cabdff1aSopenharmony_ci pc1->startpos = 0; 331cabdff1aSopenharmony_ci } 332cabdff1aSopenharmony_ci 333cabdff1aSopenharmony_ci /* read the duration and sample rate from the frame header */ 334cabdff1aSopenharmony_ci if (!dca_parse_params(pc1, buf, buf_size, &duration, &sample_rate, &avctx->profile)) { 335cabdff1aSopenharmony_ci if (!avctx->sample_rate) 336cabdff1aSopenharmony_ci avctx->sample_rate = sample_rate; 337cabdff1aSopenharmony_ci s->duration = av_rescale(duration, avctx->sample_rate, sample_rate); 338cabdff1aSopenharmony_ci } else 339cabdff1aSopenharmony_ci s->duration = 0; 340cabdff1aSopenharmony_ci 341cabdff1aSopenharmony_ci *poutbuf = buf; 342cabdff1aSopenharmony_ci *poutbuf_size = buf_size; 343cabdff1aSopenharmony_ci return next; 344cabdff1aSopenharmony_ci} 345cabdff1aSopenharmony_ci 346cabdff1aSopenharmony_ciconst AVCodecParser ff_dca_parser = { 347cabdff1aSopenharmony_ci .codec_ids = { AV_CODEC_ID_DTS }, 348cabdff1aSopenharmony_ci .priv_data_size = sizeof(DCAParseContext), 349cabdff1aSopenharmony_ci .parser_init = dca_parse_init, 350cabdff1aSopenharmony_ci .parser_parse = dca_parse, 351cabdff1aSopenharmony_ci .parser_close = ff_parse_close, 352cabdff1aSopenharmony_ci}; 353