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