19969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang/* 29969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * Copyright (C) 2011 The Android Open Source Project 39969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * 49969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * Licensed under the Apache License, Version 2.0 (the "License"); 59969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * you may not use this file except in compliance with the License. 69969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * You may obtain a copy of the License at 79969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * 89969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * http://www.apache.org/licenses/LICENSE-2.0 99969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * 109969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * Unless required by applicable law or agreed to in writing, software 119969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * distributed under the License is distributed on an "AS IS" BASIS, 129969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * See the License for the specific language governing permissions and 149969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * limitations under the License. 159969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang */ 169969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 179969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#define LOG_NDEBUG 1 189969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#define LOG_TAG "VideoEditorPlayer" 199969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#include <utils/Log.h> 209969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 219969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#include "VideoEditorPlayer.h" 229969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#include "PreviewPlayer.h" 239969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 249969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#include <media/Metadata.h> 259969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#include <media/stagefright/MediaExtractor.h> 266859837b0bdea82be855ab50bd69c5ac9b62acf2Dima Zavin 27272eb55a3855d8455bc0a12e5359d51f4010332aDima Zavin#include <system/audio.h> 289969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 299969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changnamespace android { 309969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 3143fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung ChangVideoEditorPlayer::VideoEditorPlayer(NativeWindowRenderer* renderer) 3243fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang : mPlayer(new PreviewPlayer(renderer)) { 339969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 342703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorPlayer"); 359969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang mPlayer->setListener(this); 369969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 379969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 389969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung ChangVideoEditorPlayer::~VideoEditorPlayer() { 392703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("~VideoEditorPlayer"); 409969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 419969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang reset(); 429969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang mVeAudioSink.clear(); 439969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 449969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang delete mPlayer; 459969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang mPlayer = NULL; 469969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 479969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 489969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changstatus_t VideoEditorPlayer::initCheck() { 492703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("initCheck"); 509969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return OK; 519969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 529969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 539969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 549969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changstatus_t VideoEditorPlayer::setAudioPlayer(VideoEditorAudioPlayer *audioPlayer) { 559969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return mPlayer->setAudioPlayer(audioPlayer); 569969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 579969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 589969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 599969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changstatus_t VideoEditorPlayer::setDataSource( 609969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang const char *url, const KeyedVector<String8, String8> *headers) { 61ec9e663f697df4254dacc79f52cdb633179c92abSteve Block ALOGI("setDataSource('%s')", url); 62daeb5b33861147fda0096f9c794be6f341d884c2James Dong if (headers != NULL) { 63daeb5b33861147fda0096f9c794be6f341d884c2James Dong ALOGE("Headers parameter is not supported"); 64daeb5b33861147fda0096f9c794be6f341d884c2James Dong return INVALID_OPERATION; 65daeb5b33861147fda0096f9c794be6f341d884c2James Dong } 669969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 67daeb5b33861147fda0096f9c794be6f341d884c2James Dong return mPlayer->setDataSource(url); 689969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 699969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 709969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang//We donot use this in preview, dummy implimentation as this is pure virtual 719969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changstatus_t VideoEditorPlayer::setDataSource(int fd, int64_t offset, 729969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang int64_t length) { 73f8bd29c66308c820d579b3efb0942a53a277e2c5Steve Block ALOGE("setDataSource(%d, %lld, %lld) Not supported", fd, offset, length); 749969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return (!OK); 759969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 769969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 779969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changstatus_t VideoEditorPlayer::setVideoSurface(const sp<Surface> &surface) { 782703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("setVideoSurface"); 799969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 809969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang mPlayer->setSurface(surface); 819969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return OK; 829969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 839969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 849969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changstatus_t VideoEditorPlayer::setVideoSurfaceTexture(const sp<ISurfaceTexture> &surfaceTexture) { 852703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("setVideoSurfaceTexture"); 869969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 879969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang mPlayer->setSurfaceTexture(surfaceTexture); 889969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return OK; 899969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 909969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 919969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changstatus_t VideoEditorPlayer::prepare() { 922703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("prepare"); 939969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return mPlayer->prepare(); 949969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 959969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 969969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changstatus_t VideoEditorPlayer::prepareAsync() { 979969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return mPlayer->prepareAsync(); 989969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 999969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 1009969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changstatus_t VideoEditorPlayer::start() { 1012703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("start"); 1029969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return mPlayer->play(); 1039969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 1049969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 1059969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changstatus_t VideoEditorPlayer::stop() { 1062703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("stop"); 1079969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return pause(); 1089969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 1099969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 1109969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changstatus_t VideoEditorPlayer::pause() { 1112703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("pause"); 1129969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return mPlayer->pause(); 1139969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 1149969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 1159969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changbool VideoEditorPlayer::isPlaying() { 1162703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("isPlaying"); 1179969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return mPlayer->isPlaying(); 1189969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 1199969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 1209969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changstatus_t VideoEditorPlayer::seekTo(int msec) { 1212703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("seekTo"); 1229969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang status_t err = mPlayer->seekTo((int64_t)msec * 1000); 1239969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return err; 1249969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 1259969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 1269969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changstatus_t VideoEditorPlayer::getCurrentPosition(int *msec) { 1272703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("getCurrentPosition"); 1289969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang int64_t positionUs; 1299969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang status_t err = mPlayer->getPosition(&positionUs); 1309969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 1319969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if (err != OK) { 1329969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return err; 1339969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 1349969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 1359969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang *msec = (positionUs + 500) / 1000; 1369969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return OK; 1379969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 1389969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 1399969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changstatus_t VideoEditorPlayer::getDuration(int *msec) { 1402703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("getDuration"); 1419969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 1429969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang int64_t durationUs; 1439969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang status_t err = mPlayer->getDuration(&durationUs); 1449969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 1459969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if (err != OK) { 1469969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang *msec = 0; 1479969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return OK; 1489969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 1499969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 1509969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang *msec = (durationUs + 500) / 1000; 1519969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return OK; 1529969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 1539969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 1549969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changstatus_t VideoEditorPlayer::reset() { 1552703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("reset"); 1569969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang mPlayer->reset(); 1579969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return OK; 1589969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 1599969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 1609969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changstatus_t VideoEditorPlayer::setLooping(int loop) { 1612703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("setLooping"); 1629969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return mPlayer->setLooping(loop); 1639969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 1649969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 165acb62af8ccf493b38decd91d94eb18395b6f9461Gloria Wangstatus_t VideoEditorPlayer::setParameter(int key, const Parcel &request) { 166daeb5b33861147fda0096f9c794be6f341d884c2James Dong ALOGE("setParameter not implemented"); 167daeb5b33861147fda0096f9c794be6f341d884c2James Dong return INVALID_OPERATION; 168acb62af8ccf493b38decd91d94eb18395b6f9461Gloria Wang} 169acb62af8ccf493b38decd91d94eb18395b6f9461Gloria Wang 170acb62af8ccf493b38decd91d94eb18395b6f9461Gloria Wangstatus_t VideoEditorPlayer::getParameter(int key, Parcel *reply) { 171daeb5b33861147fda0096f9c794be6f341d884c2James Dong ALOGE("getParameter not implemented"); 172daeb5b33861147fda0096f9c794be6f341d884c2James Dong return INVALID_OPERATION; 173acb62af8ccf493b38decd91d94eb18395b6f9461Gloria Wang} 174acb62af8ccf493b38decd91d94eb18395b6f9461Gloria Wang 1759969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changplayer_type VideoEditorPlayer::playerType() { 1762703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("playerType"); 1779969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return STAGEFRIGHT_PLAYER; 1789969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 1799969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 180fa31daff175709d2c58d61d1354daa9495696631Raghavender Pallavoid VideoEditorPlayer::acquireLock() { 1812703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("acquireLock"); 182fa31daff175709d2c58d61d1354daa9495696631Raghavender Palla mPlayer->acquireLock(); 183fa31daff175709d2c58d61d1354daa9495696631Raghavender Palla} 1849969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 1859969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changvoid VideoEditorPlayer::releaseLock() { 1862703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("releaseLock"); 1879969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang mPlayer->releaseLock(); 1889969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 1899969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 1909969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changstatus_t VideoEditorPlayer::invoke(const Parcel &request, Parcel *reply) { 1919969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return INVALID_OPERATION; 1929969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 1939969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 1949969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changvoid VideoEditorPlayer::setAudioSink(const sp<AudioSink> &audioSink) { 1959969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang MediaPlayerInterface::setAudioSink(audioSink); 1969969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 1979969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang mPlayer->setAudioSink(audioSink); 1989969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 1999969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 2009969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changstatus_t VideoEditorPlayer::getMetadata( 2019969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang const media::Metadata::Filter& ids, Parcel *records) { 2029969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang using media::Metadata; 2039969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 20400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong uint32_t flags = mPlayer->getSourceSeekFlags(); 2059969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 2069969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang Metadata metadata(records); 2079969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 2089969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang metadata.appendBool( 2099969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang Metadata::kPauseAvailable, 2109969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang flags & MediaExtractor::CAN_PAUSE); 2119969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 2129969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang metadata.appendBool( 2139969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang Metadata::kSeekBackwardAvailable, 2149969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang flags & MediaExtractor::CAN_SEEK_BACKWARD); 2159969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 2169969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang metadata.appendBool( 2179969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang Metadata::kSeekForwardAvailable, 2189969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang flags & MediaExtractor::CAN_SEEK_FORWARD); 2199969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 2209969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang metadata.appendBool( 2219969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang Metadata::kSeekAvailable, 2229969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang flags & MediaExtractor::CAN_SEEK); 2239969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 2249969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return OK; 2259969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 2269969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 2279969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changstatus_t VideoEditorPlayer::loadEffectsSettings( 2289969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VSS3GPP_EffectSettings* pEffectSettings, int nEffects) { 2292703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("loadEffectsSettings"); 2309969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return mPlayer->loadEffectsSettings(pEffectSettings, nEffects); 2319969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 2329969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 2339969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changstatus_t VideoEditorPlayer::loadAudioMixSettings( 2349969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4xVSS_AudioMixingSettings* pAudioMixSettings) { 2352703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorPlayer: loadAudioMixSettings"); 2369969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return mPlayer->loadAudioMixSettings(pAudioMixSettings); 2379969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 2389969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 2399969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changstatus_t VideoEditorPlayer::setAudioMixPCMFileHandle( 2409969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_Context pAudioMixPCMFileHandle) { 2419969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 2422703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorPlayer: loadAudioMixSettings"); 2439969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return mPlayer->setAudioMixPCMFileHandle(pAudioMixPCMFileHandle); 2449969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 2459969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 2469969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changstatus_t VideoEditorPlayer::setAudioMixStoryBoardParam( 2479969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_UInt32 audioMixStoryBoardTS, 2489969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_UInt32 currentMediaBeginCutTime, 2499969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_UInt32 primaryTrackVolValue) { 2509969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 2512703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorPlayer: loadAudioMixSettings"); 2529969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return mPlayer->setAudioMixStoryBoardParam(audioMixStoryBoardTS, 2539969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang currentMediaBeginCutTime, primaryTrackVolValue); 2549969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 2559969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 2569969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changstatus_t VideoEditorPlayer::setPlaybackBeginTime(uint32_t msec) { 2572703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("setPlaybackBeginTime"); 2589969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return mPlayer->setPlaybackBeginTime(msec); 2599969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 2609969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 2619969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changstatus_t VideoEditorPlayer::setPlaybackEndTime(uint32_t msec) { 2622703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("setPlaybackEndTime"); 2639969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return mPlayer->setPlaybackEndTime(msec); 2649969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 2659969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 2669969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changstatus_t VideoEditorPlayer::setStoryboardStartTime(uint32_t msec) { 2672703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("setStoryboardStartTime"); 2689969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return mPlayer->setStoryboardStartTime(msec); 2699969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 2709969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 2719969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changstatus_t VideoEditorPlayer::setProgressCallbackInterval(uint32_t cbInterval) { 2722703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("setProgressCallbackInterval"); 2739969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return mPlayer->setProgressCallbackInterval(cbInterval); 2749969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 2759969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 2769969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changstatus_t VideoEditorPlayer::setMediaRenderingMode( 2779969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4xVSS_MediaRendering mode, 2789969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIDEOEDITING_VideoFrameSize outputVideoSize) { 2799969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 2802703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("setMediaRenderingMode"); 2819969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return mPlayer->setMediaRenderingMode(mode, outputVideoSize); 2829969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 2839969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 2849969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changstatus_t VideoEditorPlayer::resetJniCallbackTimeStamp() { 2852703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("resetJniCallbackTimeStamp"); 2869969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return mPlayer->resetJniCallbackTimeStamp(); 2879969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 2889969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 2899969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changstatus_t VideoEditorPlayer::setImageClipProperties( 2909969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang uint32_t width, uint32_t height) { 2919969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return mPlayer->setImageClipProperties(width, height); 2929969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 2939969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 2949969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changstatus_t VideoEditorPlayer::readFirstVideoFrame() { 2959969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return mPlayer->readFirstVideoFrame(); 2969969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 2979969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 2989969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changstatus_t VideoEditorPlayer::getLastRenderedTimeMs(uint32_t *lastRenderedTimeMs) { 2999969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang mPlayer->getLastRenderedTimeMs(lastRenderedTimeMs); 3009969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return NO_ERROR; 3019969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 3029969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 3039969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang/* Implementation of AudioSink interface */ 3049969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#undef LOG_TAG 3059969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#define LOG_TAG "VeAudioSink" 3069969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 3079969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changint VideoEditorPlayer::VeAudioOutput::mMinBufferCount = 4; 3089969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changbool VideoEditorPlayer::VeAudioOutput::mIsOnEmulator = false; 3099969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 3109969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung ChangVideoEditorPlayer::VeAudioOutput::VeAudioOutput() 3119969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang : mCallback(NULL), 3129969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang mCallbackCookie(NULL) { 3139969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang mTrack = 0; 3149969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang mStreamType = AUDIO_STREAM_MUSIC; 3159969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang mLeftVolume = 1.0; 3169969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang mRightVolume = 1.0; 3179969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang mLatency = 0; 3189969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang mMsecsPerFrame = 0; 3199969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang mNumFramesWritten = 0; 3209969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang setMinBufferCount(); 3219969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 3229969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 3239969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung ChangVideoEditorPlayer::VeAudioOutput::~VeAudioOutput() { 3249969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang close(); 3259969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 3269969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 3279969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changvoid VideoEditorPlayer::VeAudioOutput::setMinBufferCount() { 3289969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 3299969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang mIsOnEmulator = false; 3309969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang mMinBufferCount = 4; 3319969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 3329969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 3339969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changbool VideoEditorPlayer::VeAudioOutput::isOnEmulator() { 3349969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 3359969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang setMinBufferCount(); 3369969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return mIsOnEmulator; 3379969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 3389969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 3399969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changint VideoEditorPlayer::VeAudioOutput::getMinBufferCount() { 3409969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 3419969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang setMinBufferCount(); 3429969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return mMinBufferCount; 3439969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 3449969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 3459969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changssize_t VideoEditorPlayer::VeAudioOutput::bufferSize() const { 3469969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 3479969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if (mTrack == 0) return NO_INIT; 3489969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return mTrack->frameCount() * frameSize(); 3499969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 3509969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 3519969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changssize_t VideoEditorPlayer::VeAudioOutput::frameCount() const { 3529969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 3539969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if (mTrack == 0) return NO_INIT; 3549969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return mTrack->frameCount(); 3559969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 3569969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 3579969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changssize_t VideoEditorPlayer::VeAudioOutput::channelCount() const 3589969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang{ 3599969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if (mTrack == 0) return NO_INIT; 3609969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return mTrack->channelCount(); 3619969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 3629969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 3639969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changssize_t VideoEditorPlayer::VeAudioOutput::frameSize() const 3649969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang{ 3659969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if (mTrack == 0) return NO_INIT; 3669969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return mTrack->frameSize(); 3679969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 3689969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 3699969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changuint32_t VideoEditorPlayer::VeAudioOutput::latency () const 3709969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang{ 3719969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return mLatency; 3729969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 3739969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 3749969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changfloat VideoEditorPlayer::VeAudioOutput::msecsPerFrame() const 3759969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang{ 3769969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return mMsecsPerFrame; 3779969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 3789969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 3794110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissenstatus_t VideoEditorPlayer::VeAudioOutput::getPosition(uint32_t *position) const { 3809969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 3819969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if (mTrack == 0) return NO_INIT; 3829969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return mTrack->getPosition(position); 3839969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 3849969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 3854110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissenstatus_t VideoEditorPlayer::VeAudioOutput::getFramesWritten(uint32_t *written) const { 3864110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen 3874110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen if (mTrack == 0) return NO_INIT; 3884110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen *written = mNumFramesWritten; 3894110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen return OK; 3904110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen} 3914110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen 3929969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changstatus_t VideoEditorPlayer::VeAudioOutput::open( 3938162c1a9f4df4bf4733e78f5b03398b2991ba79aJean-Michel Trivi uint32_t sampleRate, int channelCount, audio_channel_mask_t channelMask, 3948162c1a9f4df4bf4733e78f5b03398b2991ba79aJean-Michel Trivi audio_format_t format, int bufferCount, 3951948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent AudioCallback cb, void *cookie, audio_output_flags_t flags) { 3969969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 3979969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang mCallback = cb; 3989969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang mCallbackCookie = cookie; 3999969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 4009969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang // Check argument "bufferCount" against the mininum buffer count 4019969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if (bufferCount < mMinBufferCount) { 4022703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("bufferCount (%d) is too small and increased to %d", 4039969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang bufferCount, mMinBufferCount); 4049969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang bufferCount = mMinBufferCount; 4059969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 4069969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 4072703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("open(%u, %d, %d, %d)", sampleRate, channelCount, format, bufferCount); 4089969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if (mTrack) close(); 4099969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang int afSampleRate; 4109969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang int afFrameCount; 4119969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang int frameCount; 4129969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 4139969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if (AudioSystem::getOutputFrameCount(&afFrameCount, mStreamType) != 4149969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang NO_ERROR) { 4159969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return NO_INIT; 4169969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 4179969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if (AudioSystem::getOutputSamplingRate(&afSampleRate, mStreamType) != 4189969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang NO_ERROR) { 4199969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return NO_INIT; 4209969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 4219969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 4229969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang frameCount = (sampleRate*afFrameCount*bufferCount)/afSampleRate; 4239969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 4248162c1a9f4df4bf4733e78f5b03398b2991ba79aJean-Michel Trivi if (channelMask == CHANNEL_MASK_USE_CHANNEL_ORDER) { 4258162c1a9f4df4bf4733e78f5b03398b2991ba79aJean-Michel Trivi switch(channelCount) { 4268162c1a9f4df4bf4733e78f5b03398b2991ba79aJean-Michel Trivi case 1: 4278162c1a9f4df4bf4733e78f5b03398b2991ba79aJean-Michel Trivi channelMask = AUDIO_CHANNEL_OUT_MONO; 4288162c1a9f4df4bf4733e78f5b03398b2991ba79aJean-Michel Trivi break; 4298162c1a9f4df4bf4733e78f5b03398b2991ba79aJean-Michel Trivi case 2: 4308162c1a9f4df4bf4733e78f5b03398b2991ba79aJean-Michel Trivi channelMask = AUDIO_CHANNEL_OUT_STEREO; 4318162c1a9f4df4bf4733e78f5b03398b2991ba79aJean-Michel Trivi break; 4328162c1a9f4df4bf4733e78f5b03398b2991ba79aJean-Michel Trivi default: 4338162c1a9f4df4bf4733e78f5b03398b2991ba79aJean-Michel Trivi return NO_INIT; 4348162c1a9f4df4bf4733e78f5b03398b2991ba79aJean-Michel Trivi } 4358162c1a9f4df4bf4733e78f5b03398b2991ba79aJean-Michel Trivi } 4368162c1a9f4df4bf4733e78f5b03398b2991ba79aJean-Michel Trivi 4379969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang AudioTrack *t; 4389969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if (mCallback != NULL) { 4399969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang t = new AudioTrack( 4409969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang mStreamType, 4419969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang sampleRate, 4429969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang format, 4438162c1a9f4df4bf4733e78f5b03398b2991ba79aJean-Michel Trivi channelMask, 4449969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang frameCount, 4451948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent flags, 4469969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang CallbackWrapper, 4479969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang this); 4489969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } else { 4499969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang t = new AudioTrack( 4509969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang mStreamType, 4519969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang sampleRate, 4529969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang format, 4538162c1a9f4df4bf4733e78f5b03398b2991ba79aJean-Michel Trivi channelMask, 4541948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent frameCount, 4551948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent flags); 4569969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 4579969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 4589969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if ((t == 0) || (t->initCheck() != NO_ERROR)) { 459f8bd29c66308c820d579b3efb0942a53a277e2c5Steve Block ALOGE("Unable to create audio track"); 4609969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang delete t; 4619969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return NO_INIT; 4629969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 4639969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 4642703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("setVolume"); 4659969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang t->setVolume(mLeftVolume, mRightVolume); 4669969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang mMsecsPerFrame = 1.e3 / (float) sampleRate; 4679969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang mLatency = t->latency(); 4689969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang mTrack = t; 4699969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return NO_ERROR; 4709969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 4719969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 4729969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changvoid VideoEditorPlayer::VeAudioOutput::start() { 4739969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 4742703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("start"); 4759969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if (mTrack) { 4769969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang mTrack->setVolume(mLeftVolume, mRightVolume); 4779969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang mTrack->start(); 4789969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang mTrack->getPosition(&mNumFramesWritten); 4799969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 4809969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 4819969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 4829969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changvoid VideoEditorPlayer::VeAudioOutput::snoopWrite( 4839969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang const void* buffer, size_t size) { 4849969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang // Visualization buffers not supported 4859969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return; 4869969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 4879969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 4889969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 4899969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changssize_t VideoEditorPlayer::VeAudioOutput::write( 4909969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang const void* buffer, size_t size) { 4919969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 4929969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang LOG_FATAL_IF(mCallback != NULL, "Don't call write if supplying a callback."); 4939969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 4942703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block //ALOGV("write(%p, %u)", buffer, size); 4959969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if (mTrack) { 4969969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang snoopWrite(buffer, size); 4979969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang ssize_t ret = mTrack->write(buffer, size); 4989969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang mNumFramesWritten += ret / 4; // assume 16 bit stereo 4999969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return ret; 5009969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 5019969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return NO_INIT; 5029969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 5039969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 5049969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changvoid VideoEditorPlayer::VeAudioOutput::stop() { 5059969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 5062703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("stop"); 5079969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if (mTrack) mTrack->stop(); 5089969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 5099969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 5109969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changvoid VideoEditorPlayer::VeAudioOutput::flush() { 5119969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 5122703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("flush"); 5139969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if (mTrack) mTrack->flush(); 5149969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 5159969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 5169969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changvoid VideoEditorPlayer::VeAudioOutput::pause() { 5179969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 5182703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VeAudioOutput::pause"); 5199969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if (mTrack) mTrack->pause(); 5209969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 5219969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 5229969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changvoid VideoEditorPlayer::VeAudioOutput::close() { 5239969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 5242703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("close"); 5259969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang delete mTrack; 5269969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang mTrack = 0; 5279969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 5289969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 5299969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changvoid VideoEditorPlayer::VeAudioOutput::setVolume(float left, float right) { 5309969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 5312703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("setVolume(%f, %f)", left, right); 5329969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang mLeftVolume = left; 5339969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang mRightVolume = right; 5349969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if (mTrack) { 5359969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang mTrack->setVolume(left, right); 5369969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 5379969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 5389969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 5399969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang// static 5409969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changvoid VideoEditorPlayer::VeAudioOutput::CallbackWrapper( 5419969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang int event, void *cookie, void *info) { 5422703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block //ALOGV("VeAudioOutput::callbackwrapper"); 5439969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if (event != AudioTrack::EVENT_MORE_DATA) { 5449969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return; 5459969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 5469969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 5479969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang VeAudioOutput *me = (VeAudioOutput *)cookie; 5489969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang AudioTrack::Buffer *buffer = (AudioTrack::Buffer *)info; 5499969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 5509969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang size_t actualSize = (*me->mCallback)( 5519969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang me, buffer->raw, buffer->size, me->mCallbackCookie); 5529969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 5539969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang buffer->size = actualSize; 5549969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 5559969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if (actualSize > 0) { 5569969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang me->snoopWrite(buffer->raw, actualSize); 5579969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 5589969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 5599969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 5609969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changstatus_t VideoEditorPlayer::VeAudioOutput::dump(int fd, const Vector<String16>& args) const 5619969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang{ 5629969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang const size_t SIZE = 256; 5639969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang char buffer[SIZE]; 5649969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang String8 result; 5659969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 5669969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang result.append(" VeAudioOutput\n"); 5679969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang snprintf(buffer, SIZE-1, " stream type(%d), left - right volume(%f, %f)\n", 5689969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang mStreamType, mLeftVolume, mRightVolume); 5699969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang result.append(buffer); 5709969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang snprintf(buffer, SIZE-1, " msec per frame(%f), latency (%d)\n", 5719969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang mMsecsPerFrame, mLatency); 5729969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang result.append(buffer); 5739969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang ::write(fd, result.string(), result.size()); 5749969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if (mTrack != 0) { 5759969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang mTrack->dump(fd, args); 5769969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 5779969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return NO_ERROR; 5789969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 5799969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 5804110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissenint VideoEditorPlayer::VeAudioOutput::getSessionId() const { 5819969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 5829969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return mSessionId; 5839969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 5849969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 5859969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} // namespace android 586