summaryrefslogtreecommitdiff
path: root/amadec/omx_audio/DTSHD_mediasource.cpp (plain)
blob: c632c140dfbc28374b42607ee079b922c96c7af2
1#include <stdio.h>
2#include <stdarg.h>
3#include <string.h>
4#include <android/log.h>
5#include <cutils/properties.h>
6#include "DTSHD_mediasource.h"
7
8extern "C" int read_buffer(unsigned char *buffer,int size);
9
10#define LOG_TAG "DTSHD_Medissource"
11#define ALOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
12#define ALOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)
13
14
15namespace android {
16static int AML_Match_DTS_SyncWord(uint32_t ui32Temp0, uint32_t ui32Temp1)
17{
18 /* 16-bit bit core stream*/
19 if( ui32Temp0 == AML_DCA_SW_CORE_16 || ui32Temp0 == AML_DCA_SW_CORE_14 ||
20 ui32Temp0 == AML_DCA_SW_CORE_16M || ui32Temp0 == AML_DCA_SW_CORE_14M ||
21 ui32Temp0 == AML_DCA_SW_SUBSTREAM|| ui32Temp0 ==AML_DCA_SW_SUBSTREAM_M)
22 {
23 return 1;
24 }
25
26 if ((ui32Temp0 & 0xffffff00) == (AML_DCA_SW_CORE_24 & 0xffffff00) &&
27 ((ui32Temp1 >> 16) & 0xFF)== (AML_DCA_SW_CORE_24 & 0xFF))
28 {
29 return 1;
30 }
31 return 0;
32}
33static int AML_DCA_Estimate_Frame_size( unsigned char *buf,int size,int *syncpos)
34{
35 int i32Index=0;
36 int result=0;
37 unsigned int ui32Sword0=0,ui32Sword1=0;
38 unsigned int ui32Sword0_save=0;
39 int first_sync_Detected=0,first_sync_pos=-1;
40 int frame_size=0;
41 *syncpos=0;
42 for (i32Index=0; i32Index+7<size;i32Index++)
43 {
44 ui32Sword0 = buf[i32Index]; ui32Sword0 <<= 8;
45 ui32Sword0 |= buf[i32Index + 1]; ui32Sword0 <<= 8;
46 ui32Sword0 |= buf[i32Index + 2]; ui32Sword0 <<= 8;
47 ui32Sword0 |= buf[i32Index + 3];
48
49 ui32Sword1 = buf[i32Index + 4]; ui32Sword1 <<= 8;
50 ui32Sword1 |= buf[i32Index + 5]; ui32Sword1 <<= 8;
51 ui32Sword1 |= buf[i32Index + 6]; ui32Sword1 <<= 8;
52 ui32Sword1 |= buf[i32Index + 7];
53
54 result=AML_Match_DTS_SyncWord(ui32Sword0,ui32Sword1);
55
56 if (result) {
57 ALOGI("SyncWord detect: ui32Sync_word/0x%x ui32Sync_word2/0x%x ",ui32Sword0,ui32Sword1);
58 if (first_sync_Detected == 0)
59 {
60 first_sync_Detected=1;
61 first_sync_pos=i32Index;
62 ui32Sword0_save=ui32Sword0;
63 ALOGI("first_sync_pos/%d ",first_sync_pos);
64 }else if(first_sync_Detected == 1){
65 if (ui32Sword0_save == ui32Sword0)
66 {
67 frame_size=i32Index-first_sync_pos;
68 ALOGI("FrameSize detect: %d/bytes",frame_size);
69 if (frame_size < 95){
70 first_sync_pos = frame_size;
71 continue;
72 }
73
74 break;
75 }
76 }
77 }
78 }
79
80 if (frame_size == 0)
81 {
82 ALOGE("[%s %d ]FrameSize detect Falied,used defualt value/1024\n",__FUNCTION__,__LINE__);
83 frame_size=1024;
84 }else{
85 frame_size += 4;
86 }
87 *syncpos=first_sync_pos;
88 return frame_size;
89}
90
91Dtshd_MediaSource::Dtshd_MediaSource(void *read_buffer)
92{
93 ALOGI("%s %d \n",__FUNCTION__,__LINE__);
94 mStarted=false;
95 mMeta=new MetaData;
96 mDataSource=NULL;
97 mGroup=NULL;
98 mBytesReaded=0;
99 mCurrentTimeUs=0;
100 pStop_ReadBuf_Flag=NULL;
101 fpread_buffer=(fp_read_buffer)read_buffer;
102 sample_rate=0;
103 ChNum=0;
104 frame_size=0;
105 bytes_readed_sum_pre=0;
106 bytes_readed_sum=0;
107 FrameSizeDetectFlag=0;
108 FirFraBuf=NULL;
109 FirFraBuf_Len=0;
110 FirFraBuf_Offset=0;
111 FrameNumReaded=0;
112 mMeta->setInt32(kKeyChannelCount,/* audec->channels > 0?audec->channels:*/2);
113 mMeta->setInt32(kKeySampleRate, /*audec->samplerate> 0?audec->samplerate:*/48000);
114}
115
116
117Dtshd_MediaSource::~Dtshd_MediaSource()
118{
119 ALOGI("%s %d \n",__FUNCTION__,__LINE__);
120 if (FirFraBuf)
121 free(FirFraBuf);
122 if (mStarted) {
123 stop();
124 }
125}
126
127
128int Dtshd_MediaSource::GetSampleRate()
129{
130 return sample_rate;
131}
132
133int Dtshd_MediaSource::GetChNum()
134{
135 return ChNum;
136}
137int Dtshd_MediaSource::SetSampleRate(int samplerate)
138{
139 sample_rate = samplerate;
140 return OK ;
141}
142
143int* Dtshd_MediaSource::Get_pStop_ReadBuf_Flag()
144{
145 return pStop_ReadBuf_Flag;
146}
147
148int Dtshd_MediaSource::Set_pStop_ReadBuf_Flag(int *pStop)
149{
150 pStop_ReadBuf_Flag = pStop;
151 return 0;
152}
153
154int Dtshd_MediaSource::GetReadedBytes()
155{
156 return frame_size;
157}
158
159sp<MetaData> Dtshd_MediaSource::getFormat()
160{
161 ALOGI("%s %d \n",__FUNCTION__,__LINE__);
162 return mMeta;
163}
164
165status_t Dtshd_MediaSource::start(MetaData *params)
166{
167 ALOGI("%s %d \n",__FUNCTION__,__LINE__);
168 mGroup = new MediaBufferGroup;
169 mGroup->add_buffer(new MediaBuffer(AML_DCA_INPUT_DATA_LEN_PTIME));
170 mStarted = true;
171 return OK;
172}
173
174status_t Dtshd_MediaSource::stop()
175{
176 ALOGI("%s %d \n",__FUNCTION__,__LINE__);
177 delete mGroup;
178 mGroup = NULL;
179 mStarted = false;
180 return OK;
181}
182
183
184int Dtshd_MediaSource::MediaSourceRead_buffer(unsigned char *buffer,int size)
185{
186 int readcnt=0;
187 int readsum=0;
188 if (fpread_buffer != NULL)
189 {
190 int sleep_time=0;
191 while ((readsum < size)&& (*pStop_ReadBuf_Flag == 0))
192 {
193 readcnt=fpread_buffer(buffer+readsum,size-readsum);
194 if (readcnt < (size-readsum))
195 {
196 sleep_time++;
197 usleep(10000);
198 }
199 readsum+=readcnt;
200 if ((sleep_time > 0) && (sleep_time%100 == 0) )
201 { //wait for max 10s to get audio data
202 ALOGE("[%s] Can't get data from audiobuffer,wait for %d ms\n ", __FUNCTION__,sleep_time*10);
203 }
204 }
205 bytes_readed_sum +=readsum;
206 if (*pStop_ReadBuf_Flag == 1)
207 {
208 ALOGI("[%s] End of Stream: *pStop_ReadBuf_Flag==1\n ", __FUNCTION__);
209 }
210 return readsum;
211 }else{
212 ALOGE("[%s]ERR: fpread_buffer=NULL\n ", __FUNCTION__);
213 return 0;
214 }
215}
216
217
218status_t Dtshd_MediaSource::read(MediaBuffer **out, const ReadOptions *options)
219{
220 *out = NULL;
221 int read_bytes_per_time;
222 MediaBuffer *buffer;
223 int byte_readed=0;
224 status_t err;
225 if (!FrameSizeDetectFlag)
226 {
227 FirFraBuf=(unsigned char*)malloc(AML_DCA_INPUT_DATA_LEN_PTIME);
228 if (FirFraBuf == NULL)
229 {
230 ALOGE("[%s %d] mallco memory for <FirFraBuf> failed!\n",__FUNCTION__,__LINE__);
231 return ERROR_END_OF_STREAM;
232 }
233 FirFraBuf_Len=AML_DCA_INPUT_DATA_LEN_PTIME;
234 if (MediaSourceRead_buffer(FirFraBuf,FirFraBuf_Len) != FirFraBuf_Len)
235 {
236 ALOGE("[%s %d] Stream Lengh <%d> Err!\n",__FUNCTION__,__LINE__,FirFraBuf_Len);
237 return ERROR_END_OF_STREAM;
238 }
239
240 frame_size= AML_DCA_Estimate_Frame_size(FirFraBuf,FirFraBuf_Len,&FirFraBuf_Offset);
241 if (frame_size == 0)
242 {
243 ALOGE("[%s %d] Detect Frame_size Err!\n",__FUNCTION__,__LINE__);
244 return ERROR_END_OF_STREAM;
245 }
246 FrameSizeDetectFlag=1;
247 }
248
249 err = mGroup->acquire_buffer(&buffer);
250 if (err != OK) {
251 ALOGE("[%s %d] mGroup->acquire_buffer ERR!\n",__FUNCTION__,__LINE__);
252 return err;
253 }
254
255 if (FrameNumReaded == 0 && FirFraBuf_Offset > 0)
256 {
257 int pre_suspend_bytes=0;
258 int redunt=FirFraBuf_Offset%4;
259 if(redunt)
260 pre_suspend_bytes=4-redunt;
261 unsigned char zarray[32]={0};
262 memcpy((unsigned char*)(buffer->data()),FirFraBuf,FirFraBuf_Offset);
263 memcpy((unsigned char*)(buffer->data())+FirFraBuf_Offset, zarray, pre_suspend_bytes);
264 memcpy((unsigned char*)(buffer->data())+FirFraBuf_Offset+pre_suspend_bytes,FirFraBuf+FirFraBuf_Offset, frame_size);
265 memcpy(zarray,FirFraBuf,32);
266 ALOGI("[%s %d] pre_suspend_bytes/%d %s \n",__FUNCTION__,__LINE__,pre_suspend_bytes,zarray);
267
268 buffer->set_range(0, pre_suspend_bytes+FirFraBuf_Offset+frame_size);
269 buffer->meta_data()->setInt64(kKeyTime, mCurrentTimeUs);
270 buffer->meta_data()->setInt32(kKeyIsSyncFrame, 1);
271 *out = buffer;
272 FirFraBuf_Offset+=frame_size;
273 FrameNumReaded++;
274 return OK;
275 }
276
277 if (FirFraBuf_Offset < FirFraBuf_Len)
278 {
279 if (FirFraBuf_Len-FirFraBuf_Offset >= frame_size)
280 {
281 byte_readed=frame_size;
282 }else{
283 byte_readed=(FirFraBuf_Len-FirFraBuf_Offset);
284 }
285 memcpy((unsigned char*)(buffer->data()),FirFraBuf+FirFraBuf_Offset,byte_readed);
286 FirFraBuf_Offset+=byte_readed;
287 if (MediaSourceRead_buffer((unsigned char*)(buffer->data())+byte_readed,frame_size-byte_readed) != (frame_size-byte_readed))
288 {
289 buffer->release();
290 buffer = NULL;
291 return ERROR_END_OF_STREAM;
292 }
293
294 buffer->set_range(0,frame_size);
295 }else{
296 //for dtshd coceless high samplerate stream ,framesize got maybe inaccurate and causes frozen issues
297 //some coceless stream framesize about 100 bytes and need push scores of frames to decoder and paser out
298 //one real dts frame,so change the framesize to 10k.
299 if (sample_rate == 96000)
300 frame_size = AML_DCA_INPUT_DATA_LEN_PTIME;
301 if (MediaSourceRead_buffer((unsigned char*)(buffer->data()), frame_size) != frame_size)
302 {
303 buffer->release();
304 buffer = NULL;
305 return ERROR_END_OF_STREAM;
306 }
307
308 buffer->set_range(0,frame_size);
309 }
310
311 buffer->meta_data()->setInt64(kKeyTime, mCurrentTimeUs);
312 buffer->meta_data()->setInt32(kKeyIsSyncFrame, 1);
313 *out = buffer;
314 FrameNumReaded++;
315 return OK;
316}
317
318
319} // namespace android
320
321
322