VideoEditorPlayer.cpp revision 9133a10ed22acc8b2154ab187f301945bf51a1f9
1efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang/* 2efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang * Copyright (C) 2011 The Android Open Source Project 3efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang * 4efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang * Licensed under the Apache License, Version 2.0 (the "License"); 5efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang * you may not use this file except in compliance with the License. 6efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang * You may obtain a copy of the License at 7efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang * 8efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang * http://www.apache.org/licenses/LICENSE-2.0 9efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang * 10efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang * Unless required by applicable law or agreed to in writing, software 11efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang * distributed under the License is distributed on an "AS IS" BASIS, 12efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang * See the License for the specific language governing permissions and 14efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang * limitations under the License. 15efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang */ 16efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 17efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang#define LOG_NDEBUG 1 18efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang#define LOG_TAG "VideoEditorPlayer" 19efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang#include <utils/Log.h> 20efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 21efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang#include "VideoEditorPlayer.h" 22efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang#include "PreviewPlayer.h" 23efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 24efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang#include <media/Metadata.h> 25efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang#include <media/stagefright/MediaExtractor.h> 26c2f16b11f136bdde9d9950d34eab7633a35d157cDima Zavin 2799adfaa2e9ae69179129e2b53fe763eea476b1e2Dima Zavin#include <system/audio.h> 28efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 29efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changnamespace android { 30efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 319133a10ed22acc8b2154ab187f301945bf51a1f9Chih-Chung ChangVideoEditorPlayer::VideoEditorPlayer(NativeWindowRenderer* renderer) 329133a10ed22acc8b2154ab187f301945bf51a1f9Chih-Chung Chang : mPlayer(new PreviewPlayer(renderer)) { 33efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 34efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("VideoEditorPlayer"); 35efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mPlayer->setListener(this); 36efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 37efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 38efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung ChangVideoEditorPlayer::~VideoEditorPlayer() { 39efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("~VideoEditorPlayer"); 40efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 41efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang reset(); 42efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mVeAudioSink.clear(); 43efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 44efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang delete mPlayer; 45efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mPlayer = NULL; 46efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 47efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 48efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changstatus_t VideoEditorPlayer::initCheck() { 49efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("initCheck"); 50efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return OK; 51efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 52efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 53efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 54efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changstatus_t VideoEditorPlayer::setAudioPlayer(VideoEditorAudioPlayer *audioPlayer) { 55efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return mPlayer->setAudioPlayer(audioPlayer); 56efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 57efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 58efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 59efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changstatus_t VideoEditorPlayer::setDataSource( 60efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang const char *url, const KeyedVector<String8, String8> *headers) { 61efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGI("setDataSource('%s')", url); 62efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 63efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return mPlayer->setDataSource(url, headers); 64efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 65efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 66efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang//We donot use this in preview, dummy implimentation as this is pure virtual 67efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changstatus_t VideoEditorPlayer::setDataSource(int fd, int64_t offset, 68efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang int64_t length) { 69efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGE("setDataSource(%d, %lld, %lld) Not supported", fd, offset, length); 70efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return (!OK); 71efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 72efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 73efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changstatus_t VideoEditorPlayer::setVideoSurface(const sp<Surface> &surface) { 74efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("setVideoSurface"); 75efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 76efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mPlayer->setSurface(surface); 77efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return OK; 78efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 79efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 80efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changstatus_t VideoEditorPlayer::setVideoSurfaceTexture(const sp<ISurfaceTexture> &surfaceTexture) { 81efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("setVideoSurfaceTexture"); 82efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 83efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mPlayer->setSurfaceTexture(surfaceTexture); 84efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return OK; 85efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 86efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 87efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changstatus_t VideoEditorPlayer::prepare() { 88efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("prepare"); 89efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return mPlayer->prepare(); 90efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 91efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 92efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changstatus_t VideoEditorPlayer::prepareAsync() { 93efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return mPlayer->prepareAsync(); 94efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 95efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 96efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changstatus_t VideoEditorPlayer::start() { 97efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("start"); 98efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return mPlayer->play(); 99efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 100efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 101efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changstatus_t VideoEditorPlayer::stop() { 102efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("stop"); 103efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return pause(); 104efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 105efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 106efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changstatus_t VideoEditorPlayer::pause() { 107efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("pause"); 108efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return mPlayer->pause(); 109efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 110efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 111efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changbool VideoEditorPlayer::isPlaying() { 112efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("isPlaying"); 113efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return mPlayer->isPlaying(); 114efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 115efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 116efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changstatus_t VideoEditorPlayer::seekTo(int msec) { 117efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("seekTo"); 118efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang status_t err = mPlayer->seekTo((int64_t)msec * 1000); 119efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return err; 120efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 121efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 122efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changstatus_t VideoEditorPlayer::getCurrentPosition(int *msec) { 123efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("getCurrentPosition"); 124efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang int64_t positionUs; 125efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang status_t err = mPlayer->getPosition(&positionUs); 126efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 127efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if (err != OK) { 128efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return err; 129efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 130efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 131efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang *msec = (positionUs + 500) / 1000; 132efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return OK; 133efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 134efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 135efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changstatus_t VideoEditorPlayer::getDuration(int *msec) { 136efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("getDuration"); 137efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 138efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang int64_t durationUs; 139efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang status_t err = mPlayer->getDuration(&durationUs); 140efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 141efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if (err != OK) { 142efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang *msec = 0; 143efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return OK; 144efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 145efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 146efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang *msec = (durationUs + 500) / 1000; 147efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return OK; 148efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 149efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 150efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changstatus_t VideoEditorPlayer::reset() { 151efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("reset"); 152efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mPlayer->reset(); 153efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return OK; 154efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 155efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 156efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changstatus_t VideoEditorPlayer::setLooping(int loop) { 157efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("setLooping"); 158efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return mPlayer->setLooping(loop); 159efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 160efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1618d96225eaa8d3a0659ab826bf35d2a85f3c55fa8Gloria Wangstatus_t VideoEditorPlayer::setParameter(int key, const Parcel &request) { 1628d96225eaa8d3a0659ab826bf35d2a85f3c55fa8Gloria Wang LOGV("setParameter"); 1638d96225eaa8d3a0659ab826bf35d2a85f3c55fa8Gloria Wang return mPlayer->setParameter(key, request); 1648d96225eaa8d3a0659ab826bf35d2a85f3c55fa8Gloria Wang} 1658d96225eaa8d3a0659ab826bf35d2a85f3c55fa8Gloria Wang 1668d96225eaa8d3a0659ab826bf35d2a85f3c55fa8Gloria Wangstatus_t VideoEditorPlayer::getParameter(int key, Parcel *reply) { 1678d96225eaa8d3a0659ab826bf35d2a85f3c55fa8Gloria Wang LOGV("getParameter"); 1688d96225eaa8d3a0659ab826bf35d2a85f3c55fa8Gloria Wang return mPlayer->getParameter(key, reply); 1698d96225eaa8d3a0659ab826bf35d2a85f3c55fa8Gloria Wang} 1708d96225eaa8d3a0659ab826bf35d2a85f3c55fa8Gloria Wang 171efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changplayer_type VideoEditorPlayer::playerType() { 172efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("playerType"); 173efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return STAGEFRIGHT_PLAYER; 174efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 175efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1762d44979102ca85d5c4ee68d0388ee2fe37c4ec1aRaghavender Pallavoid VideoEditorPlayer::acquireLock() { 1772d44979102ca85d5c4ee68d0388ee2fe37c4ec1aRaghavender Palla LOGV("acquireLock"); 1782d44979102ca85d5c4ee68d0388ee2fe37c4ec1aRaghavender Palla mPlayer->acquireLock(); 1792d44979102ca85d5c4ee68d0388ee2fe37c4ec1aRaghavender Palla} 180efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 181efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changvoid VideoEditorPlayer::releaseLock() { 182efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("releaseLock"); 183efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mPlayer->releaseLock(); 184efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 185efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 186efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changstatus_t VideoEditorPlayer::invoke(const Parcel &request, Parcel *reply) { 187efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return INVALID_OPERATION; 188efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 189efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 190efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changvoid VideoEditorPlayer::setAudioSink(const sp<AudioSink> &audioSink) { 191efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang MediaPlayerInterface::setAudioSink(audioSink); 192efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 193efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mPlayer->setAudioSink(audioSink); 194efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 195efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 196efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changstatus_t VideoEditorPlayer::getMetadata( 197efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang const media::Metadata::Filter& ids, Parcel *records) { 198efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang using media::Metadata; 199efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 200efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang uint32_t flags = mPlayer->flags(); 201efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 202efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang Metadata metadata(records); 203efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 204efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang metadata.appendBool( 205efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang Metadata::kPauseAvailable, 206efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang flags & MediaExtractor::CAN_PAUSE); 207efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 208efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang metadata.appendBool( 209efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang Metadata::kSeekBackwardAvailable, 210efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang flags & MediaExtractor::CAN_SEEK_BACKWARD); 211efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 212efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang metadata.appendBool( 213efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang Metadata::kSeekForwardAvailable, 214efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang flags & MediaExtractor::CAN_SEEK_FORWARD); 215efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 216efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang metadata.appendBool( 217efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang Metadata::kSeekAvailable, 218efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang flags & MediaExtractor::CAN_SEEK); 219efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 220efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return OK; 221efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 222efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 223efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changstatus_t VideoEditorPlayer::loadEffectsSettings( 224efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4VSS3GPP_EffectSettings* pEffectSettings, int nEffects) { 225efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("loadEffectsSettings"); 226efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return mPlayer->loadEffectsSettings(pEffectSettings, nEffects); 227efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 228efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 229efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changstatus_t VideoEditorPlayer::loadAudioMixSettings( 230efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4xVSS_AudioMixingSettings* pAudioMixSettings) { 231efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("VideoEditorPlayer: loadAudioMixSettings"); 232efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return mPlayer->loadAudioMixSettings(pAudioMixSettings); 233efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 234efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 235efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changstatus_t VideoEditorPlayer::setAudioMixPCMFileHandle( 236efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4OSA_Context pAudioMixPCMFileHandle) { 237efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 238efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("VideoEditorPlayer: loadAudioMixSettings"); 239efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return mPlayer->setAudioMixPCMFileHandle(pAudioMixPCMFileHandle); 240efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 241efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 242efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changstatus_t VideoEditorPlayer::setAudioMixStoryBoardParam( 243efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4OSA_UInt32 audioMixStoryBoardTS, 244efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4OSA_UInt32 currentMediaBeginCutTime, 245efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4OSA_UInt32 primaryTrackVolValue) { 246efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 247efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("VideoEditorPlayer: loadAudioMixSettings"); 248efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return mPlayer->setAudioMixStoryBoardParam(audioMixStoryBoardTS, 249efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang currentMediaBeginCutTime, primaryTrackVolValue); 250efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 251efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 252efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changstatus_t VideoEditorPlayer::setPlaybackBeginTime(uint32_t msec) { 253efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("setPlaybackBeginTime"); 254efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return mPlayer->setPlaybackBeginTime(msec); 255efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 256efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 257efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changstatus_t VideoEditorPlayer::setPlaybackEndTime(uint32_t msec) { 258efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("setPlaybackEndTime"); 259efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return mPlayer->setPlaybackEndTime(msec); 260efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 261efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 262efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changstatus_t VideoEditorPlayer::setStoryboardStartTime(uint32_t msec) { 263efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("setStoryboardStartTime"); 264efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return mPlayer->setStoryboardStartTime(msec); 265efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 266efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 267efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changstatus_t VideoEditorPlayer::setProgressCallbackInterval(uint32_t cbInterval) { 268efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("setProgressCallbackInterval"); 269efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return mPlayer->setProgressCallbackInterval(cbInterval); 270efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 271efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 272efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changstatus_t VideoEditorPlayer::setMediaRenderingMode( 273efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4xVSS_MediaRendering mode, 274efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4VIDEOEDITING_VideoFrameSize outputVideoSize) { 275efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 276efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("setMediaRenderingMode"); 277efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return mPlayer->setMediaRenderingMode(mode, outputVideoSize); 278efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 279efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 280efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changstatus_t VideoEditorPlayer::resetJniCallbackTimeStamp() { 281efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("resetJniCallbackTimeStamp"); 282efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return mPlayer->resetJniCallbackTimeStamp(); 283efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 284efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 285efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changstatus_t VideoEditorPlayer::setImageClipProperties( 286efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang uint32_t width, uint32_t height) { 287efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return mPlayer->setImageClipProperties(width, height); 288efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 289efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 290efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changstatus_t VideoEditorPlayer::readFirstVideoFrame() { 291efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return mPlayer->readFirstVideoFrame(); 292efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 293efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 294efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changstatus_t VideoEditorPlayer::getLastRenderedTimeMs(uint32_t *lastRenderedTimeMs) { 295efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mPlayer->getLastRenderedTimeMs(lastRenderedTimeMs); 296efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return NO_ERROR; 297efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 298efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 299efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang/* Implementation of AudioSink interface */ 300efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang#undef LOG_TAG 301efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang#define LOG_TAG "VeAudioSink" 302efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 303efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changint VideoEditorPlayer::VeAudioOutput::mMinBufferCount = 4; 304efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changbool VideoEditorPlayer::VeAudioOutput::mIsOnEmulator = false; 305efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 306efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung ChangVideoEditorPlayer::VeAudioOutput::VeAudioOutput() 307efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang : mCallback(NULL), 308efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mCallbackCookie(NULL) { 309efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mTrack = 0; 310efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mStreamType = AUDIO_STREAM_MUSIC; 311efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mLeftVolume = 1.0; 312efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mRightVolume = 1.0; 313efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mLatency = 0; 314efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mMsecsPerFrame = 0; 315efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mNumFramesWritten = 0; 316efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang setMinBufferCount(); 317efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 318efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 319efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung ChangVideoEditorPlayer::VeAudioOutput::~VeAudioOutput() { 320efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang close(); 321efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 322efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 323efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changvoid VideoEditorPlayer::VeAudioOutput::setMinBufferCount() { 324efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 325efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mIsOnEmulator = false; 326efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mMinBufferCount = 4; 327efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 328efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 329efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changbool VideoEditorPlayer::VeAudioOutput::isOnEmulator() { 330efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 331efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang setMinBufferCount(); 332efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return mIsOnEmulator; 333efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 334efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 335efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changint VideoEditorPlayer::VeAudioOutput::getMinBufferCount() { 336efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 337efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang setMinBufferCount(); 338efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return mMinBufferCount; 339efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 340efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 341efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changssize_t VideoEditorPlayer::VeAudioOutput::bufferSize() const { 342efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 343efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if (mTrack == 0) return NO_INIT; 344efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return mTrack->frameCount() * frameSize(); 345efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 346efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 347efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changssize_t VideoEditorPlayer::VeAudioOutput::frameCount() const { 348efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 349efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if (mTrack == 0) return NO_INIT; 350efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return mTrack->frameCount(); 351efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 352efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 353efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changssize_t VideoEditorPlayer::VeAudioOutput::channelCount() const 354efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang{ 355efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if (mTrack == 0) return NO_INIT; 356efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return mTrack->channelCount(); 357efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 358efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 359efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changssize_t VideoEditorPlayer::VeAudioOutput::frameSize() const 360efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang{ 361efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if (mTrack == 0) return NO_INIT; 362efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return mTrack->frameSize(); 363efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 364efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 365efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changuint32_t VideoEditorPlayer::VeAudioOutput::latency () const 366efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang{ 367efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return mLatency; 368efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 369efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 370efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changfloat VideoEditorPlayer::VeAudioOutput::msecsPerFrame() const 371efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang{ 372efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return mMsecsPerFrame; 373efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 374efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 375efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changstatus_t VideoEditorPlayer::VeAudioOutput::getPosition(uint32_t *position) { 376efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 377efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if (mTrack == 0) return NO_INIT; 378efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return mTrack->getPosition(position); 379efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 380efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 381efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changstatus_t VideoEditorPlayer::VeAudioOutput::open( 382efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang uint32_t sampleRate, int channelCount, int format, int bufferCount, 383efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang AudioCallback cb, void *cookie) { 384efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 385efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mCallback = cb; 386efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mCallbackCookie = cookie; 387efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 388efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Check argument "bufferCount" against the mininum buffer count 389efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if (bufferCount < mMinBufferCount) { 390efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("bufferCount (%d) is too small and increased to %d", 391efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang bufferCount, mMinBufferCount); 392efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang bufferCount = mMinBufferCount; 393efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 394efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 395efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("open(%u, %d, %d, %d)", sampleRate, channelCount, format, bufferCount); 396efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if (mTrack) close(); 397efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang int afSampleRate; 398efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang int afFrameCount; 399efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang int frameCount; 400efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 401efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if (AudioSystem::getOutputFrameCount(&afFrameCount, mStreamType) != 402efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang NO_ERROR) { 403efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return NO_INIT; 404efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 405efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if (AudioSystem::getOutputSamplingRate(&afSampleRate, mStreamType) != 406efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang NO_ERROR) { 407efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return NO_INIT; 408efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 409efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 410efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang frameCount = (sampleRate*afFrameCount*bufferCount)/afSampleRate; 411efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 412efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang AudioTrack *t; 413efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if (mCallback != NULL) { 414efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang t = new AudioTrack( 415efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mStreamType, 416efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang sampleRate, 417efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang format, 418efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang (channelCount == 2) ? 419efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang AUDIO_CHANNEL_OUT_STEREO : AUDIO_CHANNEL_OUT_MONO, 420efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang frameCount, 421efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 0 /* flags */, 422efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang CallbackWrapper, 423efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang this); 424efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } else { 425efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang t = new AudioTrack( 426efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mStreamType, 427efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang sampleRate, 428efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang format, 429efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang (channelCount == 2) ? 430efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang AUDIO_CHANNEL_OUT_STEREO : AUDIO_CHANNEL_OUT_MONO, 431efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang frameCount); 432efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 433efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 434efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if ((t == 0) || (t->initCheck() != NO_ERROR)) { 435efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGE("Unable to create audio track"); 436efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang delete t; 437efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return NO_INIT; 438efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 439efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 440efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("setVolume"); 441efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang t->setVolume(mLeftVolume, mRightVolume); 442efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mMsecsPerFrame = 1.e3 / (float) sampleRate; 443efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mLatency = t->latency(); 444efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mTrack = t; 445efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return NO_ERROR; 446efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 447efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 448efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changvoid VideoEditorPlayer::VeAudioOutput::start() { 449efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 450efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("start"); 451efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if (mTrack) { 452efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mTrack->setVolume(mLeftVolume, mRightVolume); 453efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mTrack->start(); 454efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mTrack->getPosition(&mNumFramesWritten); 455efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 456efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 457efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 458efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changvoid VideoEditorPlayer::VeAudioOutput::snoopWrite( 459efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang const void* buffer, size_t size) { 460efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Visualization buffers not supported 461efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return; 462efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 463efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 464efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 465efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changssize_t VideoEditorPlayer::VeAudioOutput::write( 466efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang const void* buffer, size_t size) { 467efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 468efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOG_FATAL_IF(mCallback != NULL, "Don't call write if supplying a callback."); 469efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 470efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang //LOGV("write(%p, %u)", buffer, size); 471efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if (mTrack) { 472efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang snoopWrite(buffer, size); 473efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang ssize_t ret = mTrack->write(buffer, size); 474efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mNumFramesWritten += ret / 4; // assume 16 bit stereo 475efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return ret; 476efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 477efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return NO_INIT; 478efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 479efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 480efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changvoid VideoEditorPlayer::VeAudioOutput::stop() { 481efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 482efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("stop"); 483efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if (mTrack) mTrack->stop(); 484efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 485efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 486efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changvoid VideoEditorPlayer::VeAudioOutput::flush() { 487efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 488efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("flush"); 489efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if (mTrack) mTrack->flush(); 490efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 491efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 492efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changvoid VideoEditorPlayer::VeAudioOutput::pause() { 493efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 494efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("VeAudioOutput::pause"); 495efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if (mTrack) mTrack->pause(); 496efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 497efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 498efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changvoid VideoEditorPlayer::VeAudioOutput::close() { 499efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 500efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("close"); 501efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang delete mTrack; 502efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mTrack = 0; 503efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 504efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 505efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changvoid VideoEditorPlayer::VeAudioOutput::setVolume(float left, float right) { 506efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 507efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("setVolume(%f, %f)", left, right); 508efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mLeftVolume = left; 509efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mRightVolume = right; 510efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if (mTrack) { 511efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mTrack->setVolume(left, right); 512efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 513efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 514efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 515efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang// static 516efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changvoid VideoEditorPlayer::VeAudioOutput::CallbackWrapper( 517efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang int event, void *cookie, void *info) { 518efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang //LOGV("VeAudioOutput::callbackwrapper"); 519efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if (event != AudioTrack::EVENT_MORE_DATA) { 520efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return; 521efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 522efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 523efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang VeAudioOutput *me = (VeAudioOutput *)cookie; 524efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang AudioTrack::Buffer *buffer = (AudioTrack::Buffer *)info; 525efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 526efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang size_t actualSize = (*me->mCallback)( 527efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang me, buffer->raw, buffer->size, me->mCallbackCookie); 528efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 529efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang buffer->size = actualSize; 530efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 531efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if (actualSize > 0) { 532efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang me->snoopWrite(buffer->raw, actualSize); 533efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 534efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 535efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 536efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changstatus_t VideoEditorPlayer::VeAudioOutput::dump(int fd, const Vector<String16>& args) const 537efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang{ 538efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang const size_t SIZE = 256; 539efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang char buffer[SIZE]; 540efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang String8 result; 541efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 542efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang result.append(" VeAudioOutput\n"); 543efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang snprintf(buffer, SIZE-1, " stream type(%d), left - right volume(%f, %f)\n", 544efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mStreamType, mLeftVolume, mRightVolume); 545efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang result.append(buffer); 546efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang snprintf(buffer, SIZE-1, " msec per frame(%f), latency (%d)\n", 547efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mMsecsPerFrame, mLatency); 548efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang result.append(buffer); 549efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang ::write(fd, result.string(), result.size()); 550efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if (mTrack != 0) { 551efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mTrack->dump(fd, args); 552efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 553efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return NO_ERROR; 554efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 555efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 556efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changint VideoEditorPlayer::VeAudioOutput::getSessionId() { 557efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 558efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return mSessionId; 559efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 560efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 561efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} // namespace android 562