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 | |
8 | extern "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 | |
15 | namespace android { |
16 | static 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 | } |
33 | static 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 | |
91 | Dtshd_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 | |
117 | Dtshd_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 | |
128 | int Dtshd_MediaSource::GetSampleRate() |
129 | { |
130 | return sample_rate; |
131 | } |
132 | |
133 | int Dtshd_MediaSource::GetChNum() |
134 | { |
135 | return ChNum; |
136 | } |
137 | int Dtshd_MediaSource::SetSampleRate(int samplerate) |
138 | { |
139 | sample_rate = samplerate; |
140 | return OK ; |
141 | } |
142 | |
143 | int* Dtshd_MediaSource::Get_pStop_ReadBuf_Flag() |
144 | { |
145 | return pStop_ReadBuf_Flag; |
146 | } |
147 | |
148 | int Dtshd_MediaSource::Set_pStop_ReadBuf_Flag(int *pStop) |
149 | { |
150 | pStop_ReadBuf_Flag = pStop; |
151 | return 0; |
152 | } |
153 | |
154 | int Dtshd_MediaSource::GetReadedBytes() |
155 | { |
156 | return frame_size; |
157 | } |
158 | |
159 | sp<MetaData> Dtshd_MediaSource::getFormat() |
160 | { |
161 | ALOGI("%s %d \n",__FUNCTION__,__LINE__); |
162 | return mMeta; |
163 | } |
164 | |
165 | status_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 | |
174 | status_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 | |
184 | int 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 | |
218 | status_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 |