summaryrefslogtreecommitdiff
path: root/amadec/omx_audio/ASF_mediasource.cpp (plain)
blob: a78226fd5325ae68dfa3134e14f373597f769bf7
1#include <stdio.h>
2#include <stdarg.h>
3#include <string.h>
4#include <android/log.h>
5#include <cutils/properties.h>
6#include "ASF_mediasource.h"
7#include "audio-dec.h"
8extern "C" int read_buffer(unsigned char *buffer,int size);
9
10#define LOG_TAG "Asf_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 {
16
17int Asf_MediaSource::set_Asf_MetaData(aml_audio_dec_t *audec)
18{
19 Asf_audio_info_t *paudio_info=(Asf_audio_info_t*)audec->extradata;
20
21 sample_rate=audec->samplerate=paudio_info->sample_rate;
22 ChNum =audec->channels =paudio_info->channels>2? 2: paudio_info->channels;
23 block_align=paudio_info->block_align;
24 mMeta->setInt32(kKeySampleRate,paudio_info->sample_rate );
25 mMeta->setInt32(kKeyChannelCount, paudio_info->channels);
26 mMeta->setInt32(kKeyBitRate,paudio_info->bitrate);
27/*
28 if(paudio_info->codec_id==CODEC_ID_WMAV1_FFMPEG)
29 paudio_info->codec_id=CODEC_ID_WMAV1_OMX;
30 else if(paudio_info->codec_id==CODEC_ID_WMAV2_FFMPEG)
31 paudio_info->codec_id=CODEC_ID_WMAV2_OMX;
32*/
33 mMeta->setInt32(kKeyCodecID,paudio_info->codec_id);
34 mMeta->setData(kKeyExtraData,0,paudio_info->extradata,paudio_info->extradata_size);
35 mMeta->setInt32(kKeyExtraDataSize, paudio_info->extradata_size);
36 mMeta->setInt32(kKeyBlockAlign,paudio_info->block_align);
37
38 ALOGI("ASF-->channels/%d samplerate/%d bitrate/%d codec_ID/0x%x extradata_size/%d block_align/%d\n",ChNum,sample_rate,
39 paudio_info->bitrate,paudio_info->codec_id,paudio_info->extradata_size,block_align);
40
41 if(ChNum==1 && paudio_info->codec_id==CODEC_ID_WMAV2){
42 ChNum=2;
43 ALOGI("ASF-->here ChNum:change mono to stero!\n");
44 }
45 return 0;
46}
47int Asf_MediaSource::MediaSourceRead_buffer(unsigned char *buffer,int size)
48{
49 int readcnt=0;
50 int readsum=0;
51 if(fpread_buffer!=NULL)
52 { int sleep_time=0;
53 while((readsum<size) && (*pStop_ReadBuf_Flag==0))
54 {
55 readcnt=fpread_buffer(buffer+readsum,size-readsum);
56 if(readcnt<(size-readsum)){
57 sleep_time++;
58 usleep(10000);
59 }
60 readsum+=readcnt;
61 }
62 bytes_readed_sum +=readsum;
63 if(*pStop_ReadBuf_Flag==1)
64 {
65 ALOGI("[%s] End of Stream: *pStop_ReadBuf_Flag==1\n ", __FUNCTION__);
66 }
67 return readsum;
68 }else{
69 ALOGI("[%s]ERR: fpread_buffer=NULL\n ", __FUNCTION__);
70 return 0;
71 }
72}
73
74//-------------------------------------------------------------------------
75Asf_MediaSource::Asf_MediaSource(void *read_buffer, aml_audio_dec_t *audec)
76{
77 ALOGI("[%s] in line (%d) \n",__FUNCTION__,__LINE__);
78 mStarted=false;
79 mMeta=new MetaData;
80 mDataSource=NULL;
81 mGroup=NULL;
82 mCurrentTimeUs=0;
83 pStop_ReadBuf_Flag=NULL;
84 fpread_buffer=(fp_read_buffer)read_buffer;
85 sample_rate=0;
86 ChNum=0;
87 frame_size=0;
88 block_align=0;
89 bytes_readed_sum_pre=0;
90 bytes_readed_sum=0;
91 set_Asf_MetaData(audec);
92
93}
94Asf_MediaSource::~Asf_MediaSource()
95{
96 ALOGI("[%s] in line (%d) \n",__FUNCTION__,__LINE__);
97 if (mStarted)
98 stop();
99}
100int Asf_MediaSource::GetSampleRate()
101{
102 return sample_rate;
103}
104
105int Asf_MediaSource::GetChNum()
106{
107 return ChNum;
108}
109
110int* Asf_MediaSource::Get_pStop_ReadBuf_Flag()
111{
112 return pStop_ReadBuf_Flag;
113}
114
115int Asf_MediaSource::Set_pStop_ReadBuf_Flag(int *pStop)
116{
117 pStop_ReadBuf_Flag = pStop;
118 return 0;
119}
120
121int Asf_MediaSource::GetReadedBytes()
122{
123 return block_align;
124}
125
126sp<MetaData> Asf_MediaSource::getFormat() {
127 ALOGI("[%s] in line (%d) \n",__FUNCTION__,__LINE__);
128 return mMeta;
129}
130
131status_t Asf_MediaSource::start(MetaData *params)
132{
133 ALOGI("[%s] in line (%d) \n",__FUNCTION__,__LINE__);
134 mGroup = new MediaBufferGroup;
135 mGroup->add_buffer(new MediaBuffer(block_align));
136 mStarted = true;
137 return OK;
138}
139
140status_t Asf_MediaSource::stop()
141{
142 ALOGI("[%s] in line (%d) \n",__FUNCTION__,__LINE__);
143 delete mGroup;
144 mGroup = NULL;
145 mStarted = false;
146 return OK;
147}
148
149status_t Asf_MediaSource::read(MediaBuffer **out, const ReadOptions *options)
150{
151 *out = NULL;
152 int readedbytes = 0;
153 unsigned char header_buffer[5];
154 frame_size = 0;
155
156 if (*pStop_ReadBuf_Flag==1){
157 ALOGI("Stop_ReadBuf_Flag==1 stop read_buf [%s %d]",__FUNCTION__,__LINE__);
158 return ERROR_END_OF_STREAM;
159 }
160
161 MediaBuffer *buffer;
162 status_t err = mGroup->acquire_buffer(&buffer);
163 if (err != OK) {
164 return err;
165 }
166
167 if (MediaSourceRead_buffer((unsigned char*)(buffer->data()),block_align) != block_align)
168 {
169 buffer->release();
170 buffer = NULL;
171 return ERROR_END_OF_STREAM;
172 }
173
174 buffer->set_range(0, block_align);
175 buffer->meta_data()->setInt64(kKeyTime, mCurrentTimeUs);
176
177 *out = buffer;
178 return OK;
179}
180
181
182
183
184} // namespace android
185