1 /*************************************************************************** 2 \file ADM_aacLatm.h 3 \brief Extract AAC frames from LATM 4 Derived from vlc file mpeg4audio.c 5 Copyright (C) 2001, 2002, 2006 the VideoLAN team 6 * $Id: 3e4561c09d213a64031992f729c671bed66e824c $ 7 * 8 * Authors: Laurent Aimar <fenrir@via.ecp.fr> 9 * Gildas Bazin <gbazin@netcourrier.com> 10 11 ***************************************************************************/ 12 13 /*************************************************************************** 14 * * 15 * This program is free software; you can redistribute it and/or modify * 16 * it under the terms of the GNU General Public License as published by * 17 * the Free Software Foundation; either version 2 of the License, or * 18 * (at your option) any later version. * 19 * * 20 ***************************************************************************/ 21 22 #ifndef ADM_AAC_LATM 23 #define ADM_AAC_LATM 24 25 #include "ADM_audioParser6_export.h" 26 #include "ADM_getbits.h" 27 #include "ADM_byteBuffer.h" 28 #include <list> 29 #include "ADM_ptrQueue.h" 30 /** 31 \class ADM_latm2aac 32 */ 33 #define AAC_LATM_MAX_EXTRA 10 34 #define LATM_MAX_LAYER 64 35 #define LATM_MAX_BUFFER_SIZE 8192 36 #define INCOMING_BUFFER_SIZE (LATM_MAX_BUFFER_SIZE*4) 37 #define LATM_NB_BUFFERS 16 38 39 typedef struct 40 { 41 int nbLayers; 42 int payload[LATM_MAX_LAYER]; 43 int frameLengthType[LATM_MAX_LAYER]; 44 int audioMuxVersion; 45 int audioMuxVersionA; 46 bool allStreamsSameTimeFraming; 47 bool gotConfig; 48 }latmConf_t; 49 50 /** 51 * \class latmBuffer 52 */ 53 class latmBuffer 54 { 55 public: 56 ADM_byteBuffer buffer; 57 uint32_t bufferLen; 58 uint64_t dts; latmBuffer()59 latmBuffer() 60 { 61 buffer.setSize(LATM_MAX_BUFFER_SIZE); 62 } 63 }; 64 65 class ADM_AUDIOPARSER6_EXPORT ADM_latm2aac 66 { 67 private: 68 latmBuffer buffers[LATM_NB_BUFFERS]; 69 ADM_ptrQueue <latmBuffer > listOfFreeBuffers; 70 ADM_ptrQueue <latmBuffer > listOfUsedBuffers; 71 ADM_byteBuffer depot; 72 int head,tail; 73 uint32_t extraLen; 74 uint8_t extraData[AAC_LATM_MAX_EXTRA]; 75 uint32_t fq,channels; 76 bool readAudioMux(uint64_t dts, getBits &bits ); 77 bool demuxLatm(uint64_t date,uint8_t *start,uint32_t size); 78 bool AudioSpecificConfig(getBits &bits,int &bitsConsumed); 79 bool readStreamMuxConfig(getBits &bits); 80 int readPayloadInfoLength(getBits &bits); 81 bool readPayload(getBits &bits, uint64_t dts,int size); 82 83 latmConf_t conf; 84 public: 85 bool getExtraData(uint32_t *len,uint8_t **data); 86 bool pushData (int incomingLen,uint8_t *intData); 87 bool empty(void); 88 89 typedef enum { LATM_OK, LATM_ERROR, LATM_MORE_DATA_NEEDED } LATM_STATE; 90 LATM_STATE convert(uint64_t dts=ADM_NO_PTS); 91 92 bool getData(uint64_t *date, uint32_t *len, uint8_t *data,uint32_t maxData); 93 bool flush(void); 94 int getFrequency(void); 95 int getChannels(void); 96 ADM_latm2aac(); 97 ~ADM_latm2aac(); 98 99 }; 100 #endif 101 102