blob: fea24c73c406f90e7f7e20de3fed4b643560e04a [file] [log] [blame]
Dharmaray Kundargi643290d2011-01-16 16:02:42 -08001/*
Dharmaray Kundargi643290d2011-01-16 16:02:42 -08002 * Copyright (C) 2011 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#define LOG_NDEBUG 1
18#define LOG_TAG "VideoEditorAudioPlayer"
19#include <utils/Log.h>
20
21#include <binder/IPCThreadState.h>
22#include <media/AudioTrack.h>
23#include <VideoEditorAudioPlayer.h>
24#include <media/stagefright/MediaDebug.h>
25#include <media/stagefright/MediaDefs.h>
26#include <media/stagefright/MediaErrors.h>
27#include <media/stagefright/MediaSource.h>
28#include <media/stagefright/MetaData.h>
29
Dima Zavin272eb552011-05-11 14:15:37 -070030#include <system/audio.h>
Dima Zavin68598372011-04-05 16:13:49 -070031
Dharmaray Kundargi643290d2011-01-16 16:02:42 -080032#include "PreviewPlayer.h"
33namespace android {
34
35VideoEditorAudioPlayer::VideoEditorAudioPlayer(
36 const sp<MediaPlayerBase::AudioSink> &audioSink,
James Dongc9dedc42011-05-01 12:36:22 -070037 PreviewPlayerBase *observer)
38 : AudioPlayerBase(audioSink, observer) {
Dharmaray Kundargi643290d2011-01-16 16:02:42 -080039
40 LOGV("VideoEditorAudioPlayer");
41 mBGAudioPCMFileHandle = NULL;
Dheeraj Sharma5bc7fb42011-02-13 20:31:27 -080042 mAudioProcess = NULL;
Dharmaray Kundargi643290d2011-01-16 16:02:42 -080043 mBGAudioPCMFileLength = 0;
44 mBGAudioPCMFileTrimmedLength = 0;
45 mBGAudioPCMFileDuration = 0;
46 mBGAudioPCMFileSeekPoint = 0;
47 mBGAudioPCMFileOriginalSeekPoint = 0;
48 mBGAudioStoryBoardSkimTimeStamp = 0;
49 mBGAudioStoryBoardCurrentMediaBeginCutTS = 0;
50 mBGAudioStoryBoardCurrentMediaVolumeVal = 0;
51 mSeekTimeUs = 0;
Rajneesh Chowdury1c97d9a2011-02-21 15:43:33 -080052 mSource = NULL;
Dharmaray Kundargi643290d2011-01-16 16:02:42 -080053}
54
55VideoEditorAudioPlayer::~VideoEditorAudioPlayer() {
56
57 LOGV("~VideoEditorAudioPlayer");
58 if (mStarted) {
59 reset();
60 }
Santosh Madhava5df81852011-02-11 00:43:26 -080061 if (mAudioProcess != NULL) {
62 delete mAudioProcess;
63 mAudioProcess = NULL;
64 }
Dharmaray Kundargi643290d2011-01-16 16:02:42 -080065}
Rajneesh Chowdury1c97d9a2011-02-21 15:43:33 -080066void VideoEditorAudioPlayer::setSource(const sp<MediaSource> &source) {
67 Mutex::Autolock autoLock(mLock);
Rajneesh Chowduryb6e2b5c2011-02-25 22:59:46 -080068
69 // Before setting source, stop any existing source.
70 // Make sure to release any buffer we hold onto so that the
71 // source is able to stop().
72
73 if (mFirstBuffer != NULL) {
74 mFirstBuffer->release();
75 mFirstBuffer = NULL;
76 }
77
78 if (mInputBuffer != NULL) {
79 LOGV("VideoEditorAudioPlayer releasing input buffer.");
80
81 mInputBuffer->release();
82 mInputBuffer = NULL;
83 }
84
85 if (mSource != NULL) {
86 mSource->stop();
87 mSource.clear();
88 }
89
Rajneesh Chowdury1c97d9a2011-02-21 15:43:33 -080090 mSource = source;
91 mReachedEOS = false;
92}
93
94sp<MediaSource> VideoEditorAudioPlayer::getSource() {
95 Mutex::Autolock autoLock(mLock);
96 return mSource;
97}
98
James Dongc9dedc42011-05-01 12:36:22 -070099void VideoEditorAudioPlayer::setObserver(PreviewPlayerBase *observer) {
Rajneesh Chowdury1c97d9a2011-02-21 15:43:33 -0800100 LOGV("setObserver");
101 //CHECK(!mStarted);
102 mObserver = observer;
103}
104
Rajneesh Chowdury1c97d9a2011-02-21 15:43:33 -0800105bool VideoEditorAudioPlayer::isStarted() {
106 return mStarted;
107}
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800108
109status_t VideoEditorAudioPlayer::start(bool sourceAlreadyStarted) {
Rajneesh Chowdury1c97d9a2011-02-21 15:43:33 -0800110 Mutex::Autolock autoLock(mLock);
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800111 CHECK(!mStarted);
112 CHECK(mSource != NULL);
113 LOGV("Start");
114 status_t err;
115 M4OSA_ERR result = M4NO_ERROR;
116 M4OSA_UInt32 startTime = 0;
117 M4OSA_UInt32 seekTimeStamp = 0;
118 M4OSA_Bool bStoryBoardTSBeyondBTEndCutTime = M4OSA_FALSE;
119
120 if (!sourceAlreadyStarted) {
121 err = mSource->start();
122 if (err != OK) {
123 return err;
124 }
125 }
126
127 // Create the BG Audio handler
128 mAudioProcess = new VideoEditorBGAudioProcessing();
129 veAudMixSettings audioMixSettings;
130
131 // Pass on the audio ducking parameters
Rajneesh Chowdury1c97d9a2011-02-21 15:43:33 -0800132 audioMixSettings.lvInDucking_threshold =
133 mAudioMixSettings->uiInDucking_threshold;
134 audioMixSettings.lvInDucking_lowVolume =
135 ((M4OSA_Float)mAudioMixSettings->uiInDucking_lowVolume) / 100.0;
136 audioMixSettings.lvInDucking_enable =
137 mAudioMixSettings->bInDucking_enable;
138 audioMixSettings.lvPTVolLevel =
139 ((M4OSA_Float)mBGAudioStoryBoardCurrentMediaVolumeVal) / 100.0;
140 audioMixSettings.lvBTVolLevel =
141 ((M4OSA_Float)mAudioMixSettings->uiAddVolume) / 100.0;
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800142 audioMixSettings.lvBTChannelCount = mAudioMixSettings->uiBTChannelCount;
143 audioMixSettings.lvPTChannelCount = mAudioMixSettings->uiNbChannels;
144
145 // Call to Audio mix param setting
146 mAudioProcess->veSetAudioProcessingParams(audioMixSettings);
147
148 // Get the BG Audio PCM file details
149 if ( mBGAudioPCMFileHandle ) {
150
151 // TODO : 32bits required for OSAL, to be updated once OSAL is updated
152 M4OSA_UInt32 tmp32 = 0;
153 result = M4OSA_fileReadGetOption(mBGAudioPCMFileHandle,
154 M4OSA_kFileReadGetFileSize,
155 (M4OSA_Void**)&tmp32);
156 mBGAudioPCMFileLength = tmp32;
157 mBGAudioPCMFileTrimmedLength = mBGAudioPCMFileLength;
158
159
160 LOGV("VideoEditorAudioPlayer::start M4OSA_kFileReadGetFileSize = %lld",
161 mBGAudioPCMFileLength);
162
163 // Get the duration in time of the audio BT
164 if ( result == M4NO_ERROR ) {
165 LOGV("VEAP: channels = %d freq = %d",
166 mAudioMixSettings->uiNbChannels, mAudioMixSettings->uiSamplingFrequency);
167
168 // No trim
169 mBGAudioPCMFileDuration = ((
170 (int64_t)(mBGAudioPCMFileLength/sizeof(M4OSA_UInt16)/
171 mAudioMixSettings->uiNbChannels))*1000 ) /
172 mAudioMixSettings->uiSamplingFrequency;
173
174 LOGV("VideoEditorAudioPlayer:: beginCutMs %d , endCutMs %d",
175 (unsigned int) mAudioMixSettings->beginCutMs,
176 (unsigned int) mAudioMixSettings->endCutMs);
177
178 // Remove the trim part
179 if ((mAudioMixSettings->beginCutMs == 0) &&
180 (mAudioMixSettings->endCutMs != 0)) {
181 // End time itself the file duration
182 mBGAudioPCMFileDuration = mAudioMixSettings->endCutMs;
183 // Limit the file length also
184 mBGAudioPCMFileTrimmedLength = ((
185 (int64_t)(mBGAudioPCMFileDuration *
186 mAudioMixSettings->uiSamplingFrequency) *
187 mAudioMixSettings->uiNbChannels) *
188 sizeof(M4OSA_UInt16)) / 1000;
189 }
190 else if ((mAudioMixSettings->beginCutMs != 0) &&
191 (mAudioMixSettings->endCutMs == mBGAudioPCMFileDuration)) {
192 // End time itself the file duration
193 mBGAudioPCMFileDuration = mBGAudioPCMFileDuration -
194 mAudioMixSettings->beginCutMs;
195 // Limit the file length also
196 mBGAudioPCMFileTrimmedLength = ((
197 (int64_t)(mBGAudioPCMFileDuration *
198 mAudioMixSettings->uiSamplingFrequency) *
199 mAudioMixSettings->uiNbChannels) *
200 sizeof(M4OSA_UInt16)) / 1000;
201 }
202 else if ((mAudioMixSettings->beginCutMs != 0) &&
203 (mAudioMixSettings->endCutMs != 0)) {
204 // End time itself the file duration
205 mBGAudioPCMFileDuration = mAudioMixSettings->endCutMs -
206 mAudioMixSettings->beginCutMs;
207 // Limit the file length also
208 mBGAudioPCMFileTrimmedLength = ((
209 (int64_t)(mBGAudioPCMFileDuration *
210 mAudioMixSettings->uiSamplingFrequency) *
211 mAudioMixSettings->uiNbChannels) *
212 sizeof(M4OSA_UInt16)) / 1000; /*make to sec from ms*/
213 }
214
215 LOGV("VideoEditorAudioPlayer: file duration recorded : %lld",
216 mBGAudioPCMFileDuration);
217 }
218
219 // Last played location to be seeked at for next media item
220 if ( result == M4NO_ERROR ) {
221 LOGV("VideoEditorAudioPlayer::mBGAudioStoryBoardSkimTimeStamp %lld",
222 mBGAudioStoryBoardSkimTimeStamp);
223 LOGV("VideoEditorAudioPlayer::uiAddCts %d",
224 mAudioMixSettings->uiAddCts);
225 if (mBGAudioStoryBoardSkimTimeStamp >= mAudioMixSettings->uiAddCts) {
226 startTime = (mBGAudioStoryBoardSkimTimeStamp -
227 mAudioMixSettings->uiAddCts);
228 }
229 else {
230 // do nothing
231 }
232
233 LOGV("VideoEditorAudioPlayer::startTime %d", startTime);
234 seekTimeStamp = 0;
235 if (startTime) {
236 if (startTime >= mBGAudioPCMFileDuration) {
237 // The BG track should be looped and started again
238 if (mAudioMixSettings->bLoop) {
239 // Add begin cut time to the mod value
240 seekTimeStamp = ((startTime%mBGAudioPCMFileDuration) +
241 mAudioMixSettings->beginCutMs);
242 }else {
243 // Looping disabled, donot do BT Mix , set to file end
244 seekTimeStamp = (mBGAudioPCMFileDuration +
245 mAudioMixSettings->beginCutMs);
246 }
247 }else {
248 // BT still present , just seek to story board time
249 seekTimeStamp = startTime + mAudioMixSettings->beginCutMs;
250 }
251 }
252 else {
253 seekTimeStamp = mAudioMixSettings->beginCutMs;
254 }
255
256 // Convert the seekTimeStamp to file location
257 mBGAudioPCMFileOriginalSeekPoint = (
258 (int64_t)(mAudioMixSettings->beginCutMs)
259 * mAudioMixSettings->uiSamplingFrequency
260 * mAudioMixSettings->uiNbChannels
261 * sizeof(M4OSA_UInt16))/ 1000 ; /*make to sec from ms*/
262
263 mBGAudioPCMFileSeekPoint = ((int64_t)(seekTimeStamp)
264 * mAudioMixSettings->uiSamplingFrequency
265 * mAudioMixSettings->uiNbChannels
266 * sizeof(M4OSA_UInt16))/ 1000 ;
267 }
268 }
269
270 // We allow an optional INFO_FORMAT_CHANGED at the very beginning
271 // of playback, if there is one, getFormat below will retrieve the
272 // updated format, if there isn't, we'll stash away the valid buffer
273 // of data to be used on the first audio callback.
274
275 CHECK(mFirstBuffer == NULL);
276
277 mFirstBufferResult = mSource->read(&mFirstBuffer);
278 if (mFirstBufferResult == INFO_FORMAT_CHANGED) {
279 LOGV("INFO_FORMAT_CHANGED!!!");
280
281 CHECK(mFirstBuffer == NULL);
282 mFirstBufferResult = OK;
283 mIsFirstBuffer = false;
284 } else {
285 mIsFirstBuffer = true;
286 }
287
288 sp<MetaData> format = mSource->getFormat();
289 const char *mime;
290 bool success = format->findCString(kKeyMIMEType, &mime);
291 CHECK(success);
292 CHECK(!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_RAW));
293
294 success = format->findInt32(kKeySampleRate, &mSampleRate);
295 CHECK(success);
296
297 int32_t numChannels;
298 success = format->findInt32(kKeyChannelCount, &numChannels);
299 CHECK(success);
300
301 if (mAudioSink.get() != NULL) {
302 status_t err = mAudioSink->open(
Dima Zavin68598372011-04-05 16:13:49 -0700303 mSampleRate, numChannels, AUDIO_FORMAT_PCM_16_BIT,
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800304 DEFAULT_AUDIOSINK_BUFFERCOUNT,
305 &VideoEditorAudioPlayer::AudioSinkCallback, this);
306 if (err != OK) {
307 if (mFirstBuffer != NULL) {
308 mFirstBuffer->release();
309 mFirstBuffer = NULL;
310 }
311
312 if (!sourceAlreadyStarted) {
313 mSource->stop();
314 }
315
316 return err;
317 }
318
319 mLatencyUs = (int64_t)mAudioSink->latency() * 1000;
320 mFrameSize = mAudioSink->frameSize();
321
322 mAudioSink->start();
323 } else {
324 mAudioTrack = new AudioTrack(
Dima Zavin68598372011-04-05 16:13:49 -0700325 AUDIO_STREAM_MUSIC, mSampleRate, AUDIO_FORMAT_PCM_16_BIT,
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800326 (numChannels == 2)
Dima Zavin68598372011-04-05 16:13:49 -0700327 ? AUDIO_CHANNEL_OUT_STEREO
328 : AUDIO_CHANNEL_OUT_MONO,
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800329 0, 0, &AudioCallback, this, 0);
330
331 if ((err = mAudioTrack->initCheck()) != OK) {
332 delete mAudioTrack;
333 mAudioTrack = NULL;
334
335 if (mFirstBuffer != NULL) {
336 mFirstBuffer->release();
337 mFirstBuffer = NULL;
338 }
339
340 if (!sourceAlreadyStarted) {
341 mSource->stop();
342 }
343
344 return err;
345 }
346
347 mLatencyUs = (int64_t)mAudioTrack->latency() * 1000;
348 mFrameSize = mAudioTrack->frameSize();
349
350 mAudioTrack->start();
351 }
352
353 mStarted = true;
354
355 return OK;
356}
357
Rajneesh Chowdury1c97d9a2011-02-21 15:43:33 -0800358void VideoEditorAudioPlayer::resume() {
359
360 veAudMixSettings audioMixSettings;
361
362 // Single audio player is used;
363 // Pass on the audio ducking parameters
364 // which might have changed with new audio source
365 audioMixSettings.lvInDucking_threshold =
366 mAudioMixSettings->uiInDucking_threshold;
367 audioMixSettings.lvInDucking_lowVolume =
368 ((M4OSA_Float)mAudioMixSettings->uiInDucking_lowVolume) / 100.0;
369 audioMixSettings.lvInDucking_enable =
370 mAudioMixSettings->bInDucking_enable;
371 audioMixSettings.lvPTVolLevel =
372 ((M4OSA_Float)mBGAudioStoryBoardCurrentMediaVolumeVal) / 100.0;
373 audioMixSettings.lvBTVolLevel =
374 ((M4OSA_Float)mAudioMixSettings->uiAddVolume) / 100.0;
375 audioMixSettings.lvBTChannelCount = mAudioMixSettings->uiBTChannelCount;
376 audioMixSettings.lvPTChannelCount = mAudioMixSettings->uiNbChannels;
377
378 // Call to Audio mix param setting
379 mAudioProcess->veSetAudioProcessingParams(audioMixSettings);
380
381 //Call the base class
James Dongc9dedc42011-05-01 12:36:22 -0700382 AudioPlayerBase::resume();
Rajneesh Chowdury1c97d9a2011-02-21 15:43:33 -0800383}
384
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800385void VideoEditorAudioPlayer::reset() {
386
387 LOGV("reset");
James Dongc9dedc42011-05-01 12:36:22 -0700388 AudioPlayerBase::reset();
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800389
390 // Capture the current seek point
391 mBGAudioPCMFileSeekPoint = 0;
392 mBGAudioStoryBoardSkimTimeStamp =0;
393 mBGAudioStoryBoardCurrentMediaBeginCutTS=0;
394}
395
396size_t VideoEditorAudioPlayer::AudioSinkCallback(
397 MediaPlayerBase::AudioSink *audioSink,
398 void *buffer, size_t size, void *cookie) {
399 VideoEditorAudioPlayer *me = (VideoEditorAudioPlayer *)cookie;
400
401 return me->fillBuffer(buffer, size);
402}
403
404
405size_t VideoEditorAudioPlayer::fillBuffer(void *data, size_t size) {
406
407 if (mReachedEOS) {
408 return 0;
409 }
410
411 size_t size_done = 0;
412 size_t size_remaining = size;
413
414 M4OSA_ERR err = M4NO_ERROR;
Rajneesh Chowdury1c97d9a2011-02-21 15:43:33 -0800415 M4AM_Buffer16 bgFrame = {NULL, 0};
416 M4AM_Buffer16 mixFrame = {NULL, 0};
417 M4AM_Buffer16 ptFrame = {NULL, 0};
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800418 int64_t currentSteamTS = 0;
419 int64_t startTimeForBT = 0;
420 M4OSA_Float fPTVolLevel =
421 ((M4OSA_Float)mBGAudioStoryBoardCurrentMediaVolumeVal)/100;
Basavapatna Dattaguru100d0182011-03-04 09:48:24 -0800422 M4OSA_Int16 *pPTMdata=NULL;
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800423 M4OSA_UInt32 uiPCMsize = 0;
424
Andreas Huber838daaf2011-04-04 11:38:25 -0700425 bool postSeekComplete = false;
426 bool postEOS = false;
427
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800428 while ((size_remaining > 0)&&(err==M4NO_ERROR)) {
429 MediaSource::ReadOptions options;
430
431 {
432 Mutex::Autolock autoLock(mLock);
433 if (mSeeking) {
434 if (mIsFirstBuffer) {
435 if (mFirstBuffer != NULL) {
436 mFirstBuffer->release();
437 mFirstBuffer = NULL;
438 }
439 mIsFirstBuffer = false;
440 }
441
442 options.setSeekTo(mSeekTimeUs);
443
444 if (mInputBuffer != NULL) {
445 mInputBuffer->release();
446 mInputBuffer = NULL;
447 }
448
449 mSeeking = false;
Andreas Huber838daaf2011-04-04 11:38:25 -0700450
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800451 if (mObserver) {
Andreas Huber838daaf2011-04-04 11:38:25 -0700452 postSeekComplete = true;
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800453 }
454 }
455 }
456
457 if (mInputBuffer == NULL) {
458 status_t status = OK;
459
460 if (mIsFirstBuffer) {
461 mInputBuffer = mFirstBuffer;
462 mFirstBuffer = NULL;
463 status = mFirstBufferResult;
464
465 mIsFirstBuffer = false;
466 } else {
Rajneesh Chowdury1c97d9a2011-02-21 15:43:33 -0800467
468 {
469 Mutex::Autolock autoLock(mLock);
470 status = mSource->read(&mInputBuffer, &options);
471 }
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800472 // Data is Primary Track, mix with background track
473 // after reading same size from Background track PCM file
474 if (status == OK)
475 {
476 // Mix only when skim point is after startTime of BT
477 if (((mBGAudioStoryBoardSkimTimeStamp* 1000) +
478 (mPositionTimeMediaUs - mSeekTimeUs)) >=
479 (int64_t)(mAudioMixSettings->uiAddCts * 1000)) {
480
481 LOGV("VideoEditorAudioPlayer::INSIDE MIXING");
Rajneesh Chowdury1c97d9a2011-02-21 15:43:33 -0800482 LOGV("Checking %lld <= %lld",
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800483 mBGAudioPCMFileSeekPoint-mBGAudioPCMFileOriginalSeekPoint,
Rajneesh Chowdury1c97d9a2011-02-21 15:43:33 -0800484 mBGAudioPCMFileTrimmedLength);
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800485
486
487 M4OSA_Void* ptr;
488 ptr = (M4OSA_Void*)((unsigned int)mInputBuffer->data() +
489 mInputBuffer->range_offset());
490
491 M4OSA_UInt32 len = mInputBuffer->range_length();
492 M4OSA_Context fp = M4OSA_NULL;
493
494 uiPCMsize = (mInputBuffer->range_length())/2;
Kenny Rooteb5b2652011-02-08 11:13:19 -0800495 pPTMdata = (M4OSA_Int16*) ((uint8_t*) mInputBuffer->data()
496 + mInputBuffer->range_offset());
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800497
498 LOGV("mix with background malloc to do len %d", len);
499
Shyam Pallapothu694816d2011-04-21 09:48:41 -0700500 bgFrame.m_dataAddress = (M4OSA_UInt16*)M4OSA_32bitAlignedMalloc( len, 1,
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800501 (M4OSA_Char*)"bgFrame");
502 if (NULL == bgFrame.m_dataAddress) {
503 LOGE("mBackgroundAudioSetting Malloc failed");
504 }
505
506 bgFrame.m_bufferSize = len;
507
Shyam Pallapothu694816d2011-04-21 09:48:41 -0700508 mixFrame.m_dataAddress = (M4OSA_UInt16*)M4OSA_32bitAlignedMalloc(len, 1,
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800509 (M4OSA_Char*)"mixFrame");
510 if (NULL == mixFrame.m_dataAddress) {
511 LOGE("mBackgroundAudioSetting Malloc failed");
512 }
513
514 mixFrame.m_bufferSize = len;
515
516 LOGV("mix with bgm with size %lld", mBGAudioPCMFileLength);
517
518 CHECK(mInputBuffer->meta_data()->findInt64(kKeyTime,
519 &mPositionTimeMediaUs));
520
521 if (mBGAudioPCMFileSeekPoint -
522 mBGAudioPCMFileOriginalSeekPoint <=
523 (mBGAudioPCMFileTrimmedLength - len)) {
524
525 LOGV("Checking mBGAudioPCMFileHandle %d",
526 (unsigned int)mBGAudioPCMFileHandle);
527
528 if (mBGAudioPCMFileHandle != M4OSA_NULL) {
529 LOGV("fillBuffer seeking file to %lld",
530 mBGAudioPCMFileSeekPoint);
531
532 // TODO : 32bits required for OSAL
533 M4OSA_UInt32 tmp32 =
534 (M4OSA_UInt32)mBGAudioPCMFileSeekPoint;
535 err = M4OSA_fileReadSeek(mBGAudioPCMFileHandle,
536 M4OSA_kFileSeekBeginning,
537 (M4OSA_FilePosition*)&tmp32);
538
539 mBGAudioPCMFileSeekPoint = tmp32;
540
541 if (err != M4NO_ERROR){
Basavapatna Dattaguru100d0182011-03-04 09:48:24 -0800542 LOGE("M4OSA_fileReadSeek err %d",(int)err);
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800543 }
544
545 err = M4OSA_fileReadData(mBGAudioPCMFileHandle,
546 (M4OSA_Int8*)bgFrame.m_dataAddress,
547 (M4OSA_UInt32*)&len);
548 if (err == M4WAR_NO_DATA_YET ) {
549
550 LOGV("fillBuffer End of file reached");
551 err = M4NO_ERROR;
552
553 // We reached the end of file
554 // move to begin cut time equal value
555 if (mAudioMixSettings->bLoop) {
556 mBGAudioPCMFileSeekPoint =
557 (((int64_t)(mAudioMixSettings->beginCutMs) *
558 mAudioMixSettings->uiSamplingFrequency) *
559 mAudioMixSettings->uiNbChannels *
560 sizeof(M4OSA_UInt16)) / 1000;
561 LOGV("fillBuffer Looping \
562 to mBGAudioPCMFileSeekPoint %lld",
563 mBGAudioPCMFileSeekPoint);
564 }
565 else {
566 // No mixing;
567 // take care of volume of primary track
568 if (fPTVolLevel < 1.0) {
569 setPrimaryTrackVolume(pPTMdata,
570 uiPCMsize, fPTVolLevel);
571 }
572 }
573 } else if (err != M4NO_ERROR ) {
574 LOGV("fileReadData for audio err %d", err);
575 } else {
576 mBGAudioPCMFileSeekPoint += len;
577 LOGV("fillBuffer mBGAudioPCMFileSeekPoint \
578 %lld", mBGAudioPCMFileSeekPoint);
579
580 // Assign the ptr data to primary track
581 ptFrame.m_dataAddress = (M4OSA_UInt16*)ptr;
582 ptFrame.m_bufferSize = len;
583
584 // Call to mix and duck
585 mAudioProcess->veProcessAudioMixNDuck(
586 &ptFrame, &bgFrame, &mixFrame);
587
588 // Overwrite the decoded buffer
Shyam Pallapothu32ed3f42011-04-20 21:00:48 -0700589 memcpy((void *)ptr,
590 (void *)mixFrame.m_dataAddress, len);
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800591 }
592 }
593 } else if (mAudioMixSettings->bLoop){
594 // Move to begin cut time equal value
595 mBGAudioPCMFileSeekPoint =
596 mBGAudioPCMFileOriginalSeekPoint;
597 } else {
598 // No mixing;
599 // take care of volume level of primary track
600 if(fPTVolLevel < 1.0) {
601 setPrimaryTrackVolume(
602 pPTMdata, uiPCMsize, fPTVolLevel);
603 }
604 }
605 if (bgFrame.m_dataAddress) {
Shyam Pallapothu694816d2011-04-21 09:48:41 -0700606 free(bgFrame.m_dataAddress);
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800607 }
608 if (mixFrame.m_dataAddress) {
Shyam Pallapothu694816d2011-04-21 09:48:41 -0700609 free(mixFrame.m_dataAddress);
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800610 }
611 } else {
612 // No mixing;
613 // take care of volume level of primary track
614 if(fPTVolLevel < 1.0) {
615 setPrimaryTrackVolume(pPTMdata, uiPCMsize,
616 fPTVolLevel);
617 }
618 }
619 }
620 }
621
622 CHECK((status == OK && mInputBuffer != NULL)
623 || (status != OK && mInputBuffer == NULL));
624
625 Mutex::Autolock autoLock(mLock);
626
627 if (status != OK) {
628 LOGV("fillBuffer: mSource->read returned err %d", status);
629 if (mObserver && !mReachedEOS) {
Andreas Huber838daaf2011-04-04 11:38:25 -0700630 postEOS = true;
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800631 }
632
633 mReachedEOS = true;
634 mFinalStatus = status;
635 break;
636 }
637
638 CHECK(mInputBuffer->meta_data()->findInt64(
639 kKeyTime, &mPositionTimeMediaUs));
640
641 mPositionTimeRealUs =
642 ((mNumFramesPlayed + size_done / mFrameSize) * 1000000)
643 / mSampleRate;
644
645 LOGV("buffer->size() = %d, "
646 "mPositionTimeMediaUs=%.2f mPositionTimeRealUs=%.2f",
647 mInputBuffer->range_length(),
648 mPositionTimeMediaUs / 1E6, mPositionTimeRealUs / 1E6);
649 }
650
651 if (mInputBuffer->range_length() == 0) {
652 mInputBuffer->release();
653 mInputBuffer = NULL;
654
655 continue;
656 }
657
658 size_t copy = size_remaining;
659 if (copy > mInputBuffer->range_length()) {
660 copy = mInputBuffer->range_length();
661 }
662
663 memcpy((char *)data + size_done,
664 (const char *)mInputBuffer->data() + mInputBuffer->range_offset(),
665 copy);
666
667 mInputBuffer->set_range(mInputBuffer->range_offset() + copy,
668 mInputBuffer->range_length() - copy);
669
670 size_done += copy;
671 size_remaining -= copy;
672 }
673
Andreas Huber838daaf2011-04-04 11:38:25 -0700674 {
675 Mutex::Autolock autoLock(mLock);
676 mNumFramesPlayed += size_done / mFrameSize;
677 }
678
679 if (postEOS) {
680 mObserver->postAudioEOS();
681 }
682
683 if (postSeekComplete) {
684 mObserver->postAudioSeekComplete();
685 }
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800686
687 return size_done;
688}
689
690void VideoEditorAudioPlayer::setAudioMixSettings(
691 M4xVSS_AudioMixingSettings* pAudioMixSettings) {
692 mAudioMixSettings = pAudioMixSettings;
693}
694
695void VideoEditorAudioPlayer::setAudioMixPCMFileHandle(
696 M4OSA_Context pBGAudioPCMFileHandle){
697 mBGAudioPCMFileHandle = pBGAudioPCMFileHandle;
698}
699
700void VideoEditorAudioPlayer::setAudioMixStoryBoardSkimTimeStamp(
701 M4OSA_UInt32 pBGAudioStoryBoardSkimTimeStamp,
702 M4OSA_UInt32 pBGAudioCurrentMediaBeginCutTS,
703 M4OSA_UInt32 pBGAudioCurrentMediaVolumeVal) {
704
705 mBGAudioStoryBoardSkimTimeStamp = pBGAudioStoryBoardSkimTimeStamp;
706 mBGAudioStoryBoardCurrentMediaBeginCutTS = pBGAudioCurrentMediaBeginCutTS;
707 mBGAudioStoryBoardCurrentMediaVolumeVal = pBGAudioCurrentMediaVolumeVal;
708}
709
710void VideoEditorAudioPlayer::setPrimaryTrackVolume(
711 M4OSA_Int16 *data, M4OSA_UInt32 size, M4OSA_Float volLevel) {
712
713 while(size-- > 0) {
714 *data = (M4OSA_Int16)((*data)*volLevel);
715 data++;
716 }
717}
718
719}