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 1700f742c087d92e5452d29be1fb668022b5f8a6c7James Dong//#define LOG_NDEBUG 0 189969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#define LOG_TAG "DummyVideoSource" 1900f742c087d92e5452d29be1fb668022b5f8a6c7James Dong#include <stdlib.h> 2000f742c087d92e5452d29be1fb668022b5f8a6c7James Dong#include <utils/Log.h> 21c4689fae1bdb8d1c94eb28af1b2a1f30d2b1a3daJames Dong#include <media/stagefright/foundation/ADebug.h> 229969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#include <media/stagefright/MediaErrors.h> 239969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#include <media/stagefright/MediaDefs.h> 249969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#include <media/stagefright/MediaBuffer.h> 259969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#include <media/stagefright/MediaBufferGroup.h> 269969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#include <media/stagefright/MetaData.h> 2700f742c087d92e5452d29be1fb668022b5f8a6c7James Dong#include "VideoEditorTools.h" 289969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#include "DummyVideoSource.h" 299969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 309969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 319969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changnamespace android { 329969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 3300f742c087d92e5452d29be1fb668022b5f8a6c7James Dongsp<DummyVideoSource> DummyVideoSource::Create( 3400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong uint32_t width, uint32_t height, 3500f742c087d92e5452d29be1fb668022b5f8a6c7James Dong uint64_t clipDuration, const char *imageUri) { 3600f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 3700f742c087d92e5452d29be1fb668022b5f8a6c7James Dong ALOGV("Create"); 3800f742c087d92e5452d29be1fb668022b5f8a6c7James Dong return new DummyVideoSource( 3900f742c087d92e5452d29be1fb668022b5f8a6c7James Dong width, height, clipDuration, imageUri); 409969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 419969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 429969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 439969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 4400f742c087d92e5452d29be1fb668022b5f8a6c7James DongDummyVideoSource::DummyVideoSource( 4500f742c087d92e5452d29be1fb668022b5f8a6c7James Dong uint32_t width, uint32_t height, 4600f742c087d92e5452d29be1fb668022b5f8a6c7James Dong uint64_t clipDuration, const char *imageUri) { 4700f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 4800f742c087d92e5452d29be1fb668022b5f8a6c7James Dong ALOGV("Constructor: E"); 499969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 509969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang mFrameWidth = width; 519969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang mFrameHeight = height; 529969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang mImageClipDuration = clipDuration; 539969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang mUri = imageUri; 549969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang mImageBuffer = NULL; 559969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 5600f742c087d92e5452d29be1fb668022b5f8a6c7James Dong ALOGV("%s", mUri); 5700f742c087d92e5452d29be1fb668022b5f8a6c7James Dong ALOGV("Constructor: X"); 589969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 599969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 609969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 6100f742c087d92e5452d29be1fb668022b5f8a6c7James DongDummyVideoSource::~DummyVideoSource() { 629969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* Do nothing here? */ 6300f742c087d92e5452d29be1fb668022b5f8a6c7James Dong ALOGV("~DummyVideoSource"); 649969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 659969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 669969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 679969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 689969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changstatus_t DummyVideoSource::start(MetaData *params) { 6900f742c087d92e5452d29be1fb668022b5f8a6c7James Dong ALOGV("start: E"); 7000f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 7100f742c087d92e5452d29be1fb668022b5f8a6c7James Dong // Get the frame buffer from the rgb file, mUri, 7200f742c087d92e5452d29be1fb668022b5f8a6c7James Dong // and store its content into a MediaBuffer 7300f742c087d92e5452d29be1fb668022b5f8a6c7James Dong status_t err = LvGetImageThumbNail( 7400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong (const char *)mUri, 7500f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mFrameHeight, mFrameWidth, 7600f742c087d92e5452d29be1fb668022b5f8a6c7James Dong (M4OSA_Void **) &mImageBuffer); 7700f742c087d92e5452d29be1fb668022b5f8a6c7James Dong if (err != OK) { 7800f742c087d92e5452d29be1fb668022b5f8a6c7James Dong ALOGE("LvGetImageThumbNail failed: %d", err); 7900f742c087d92e5452d29be1fb668022b5f8a6c7James Dong return err; 8000f742c087d92e5452d29be1fb668022b5f8a6c7James Dong } 819969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 829969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang mIsFirstImageFrame = true; 839969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang mImageSeekTime = 0; 849969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang mImagePlayStartTime = 0; 859969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang mFrameTimeUs = 0; 869969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 8700f742c087d92e5452d29be1fb668022b5f8a6c7James Dong ALOGV("start: X"); 8800f742c087d92e5452d29be1fb668022b5f8a6c7James Dong return OK; 899969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 909969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 919969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 929969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changstatus_t DummyVideoSource::stop() { 9300f742c087d92e5452d29be1fb668022b5f8a6c7James Dong ALOGV("stop"); 949969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang status_t err = OK; 959969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 969969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if (mImageBuffer != NULL) { 979969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang free(mImageBuffer); 989969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang mImageBuffer = NULL; 999969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 1009969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 1019969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return err; 1029969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 1039969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 1049969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 1059969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changsp<MetaData> DummyVideoSource::getFormat() { 10600f742c087d92e5452d29be1fb668022b5f8a6c7James Dong ALOGV("getFormat"); 1079969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 1089969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang sp<MetaData> meta = new MetaData; 1099969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang meta->setInt32(kKeyColorFormat, OMX_COLOR_FormatYUV420Planar); 1109969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang meta->setInt32(kKeyWidth, mFrameWidth); 1119969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang meta->setInt32(kKeyHeight, mFrameHeight); 1129969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang meta->setInt64(kKeyDuration, mImageClipDuration); 1139969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang meta->setCString(kKeyDecoderComponent, "DummyVideoSource"); 1149969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 1159969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return meta; 1169969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 1179969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 1189969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changstatus_t DummyVideoSource::read( 11900f742c087d92e5452d29be1fb668022b5f8a6c7James Dong MediaBuffer **out, 12000f742c087d92e5452d29be1fb668022b5f8a6c7James Dong const MediaSource::ReadOptions *options) { 1219969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 12200f742c087d92e5452d29be1fb668022b5f8a6c7James Dong ALOGV("read: E"); 12300f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 12400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong const int32_t kTimeScale = 1000; /* time scale in ms */ 1259969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang bool seeking = false; 1269969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang int64_t seekTimeUs; 1279969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang ReadOptions::SeekMode seekMode; 1289969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if (options && options->getSeekTo(&seekTimeUs, &seekMode)) { 1299969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang seeking = true; 1309969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang mImageSeekTime = seekTimeUs; 13100f742c087d92e5452d29be1fb668022b5f8a6c7James Dong M4OSA_clockGetTime(&mImagePlayStartTime, kTimeScale); 1329969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 1339969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 13400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong if ((mImageSeekTime == mImageClipDuration) || 13500f742c087d92e5452d29be1fb668022b5f8a6c7James Dong (mFrameTimeUs == (int64_t)mImageClipDuration)) { 13600f742c087d92e5452d29be1fb668022b5f8a6c7James Dong ALOGV("read: EOS reached"); 1379969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang *out = NULL; 1389969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return ERROR_END_OF_STREAM; 1399969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 1409969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 14100f742c087d92e5452d29be1fb668022b5f8a6c7James Dong status_t err = OK; 14200f742c087d92e5452d29be1fb668022b5f8a6c7James Dong MediaBuffer *buffer = new MediaBuffer( 14300f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mImageBuffer, (mFrameWidth * mFrameHeight * 1.5)); 1449969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 14500f742c087d92e5452d29be1fb668022b5f8a6c7James Dong // Set timestamp of buffer 1469969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if (mIsFirstImageFrame) { 14700f742c087d92e5452d29be1fb668022b5f8a6c7James Dong M4OSA_clockGetTime(&mImagePlayStartTime, kTimeScale); 1489969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang mFrameTimeUs = (mImageSeekTime + 1); 14900f742c087d92e5452d29be1fb668022b5f8a6c7James Dong ALOGV("read: jpg 1st frame timeUs = %lld, begin cut time = %ld", 15000f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mFrameTimeUs, mImageSeekTime); 15100f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 1529969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang mIsFirstImageFrame = false; 1539969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } else { 1549969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_Time currentTimeMs; 15500f742c087d92e5452d29be1fb668022b5f8a6c7James Dong M4OSA_clockGetTime(¤tTimeMs, kTimeScale); 15600f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 15700f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mFrameTimeUs = mImageSeekTime + 15800f742c087d92e5452d29be1fb668022b5f8a6c7James Dong (currentTimeMs - mImagePlayStartTime) * 1000LL; 1599969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 16000f742c087d92e5452d29be1fb668022b5f8a6c7James Dong ALOGV("read: jpg frame timeUs = %lld", mFrameTimeUs); 1619969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 16200f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 1639969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang buffer->meta_data()->setInt64(kKeyTime, mFrameTimeUs); 16400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong buffer->set_range(buffer->range_offset(), 16500f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mFrameWidth * mFrameHeight * 1.5); 16600f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 1679969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang *out = buffer; 1689969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return err; 1699969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 1709969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 1719969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}// namespace android 172