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" |
8 | extern "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 | |
15 | namespace android { |
16 | |
17 | int 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 | } |
47 | int 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 | //------------------------------------------------------------------------- |
75 | Asf_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 | } |
94 | Asf_MediaSource::~Asf_MediaSource() |
95 | { |
96 | ALOGI("[%s] in line (%d) \n",__FUNCTION__,__LINE__); |
97 | if (mStarted) |
98 | stop(); |
99 | } |
100 | int Asf_MediaSource::GetSampleRate() |
101 | { |
102 | return sample_rate; |
103 | } |
104 | |
105 | int Asf_MediaSource::GetChNum() |
106 | { |
107 | return ChNum; |
108 | } |
109 | |
110 | int* Asf_MediaSource::Get_pStop_ReadBuf_Flag() |
111 | { |
112 | return pStop_ReadBuf_Flag; |
113 | } |
114 | |
115 | int Asf_MediaSource::Set_pStop_ReadBuf_Flag(int *pStop) |
116 | { |
117 | pStop_ReadBuf_Flag = pStop; |
118 | return 0; |
119 | } |
120 | |
121 | int Asf_MediaSource::GetReadedBytes() |
122 | { |
123 | return block_align; |
124 | } |
125 | |
126 | sp<MetaData> Asf_MediaSource::getFormat() { |
127 | ALOGI("[%s] in line (%d) \n",__FUNCTION__,__LINE__); |
128 | return mMeta; |
129 | } |
130 | |
131 | status_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 | |
140 | status_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 | |
149 | status_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 |