MediaPuller.cpp revision e1957358f11031a554c57d4fb46988dd6044acc1
1e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber/* 2e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber * Copyright 2012, The Android Open Source Project 3e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber * 4e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 5e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber * you may not use this file except in compliance with the License. 6e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber * You may obtain a copy of the License at 7e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber * 8e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 9e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber * 10e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber * Unless required by applicable law or agreed to in writing, software 11e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 12e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber * See the License for the specific language governing permissions and 14e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber * limitations under the License. 15e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber */ 16e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber 17e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber//#define LOG_NDEBUG 0 18e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber#define LOG_TAG "MediaPuller" 19e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber#include <utils/Log.h> 20e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber 21e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber#include "MediaPuller.h" 22e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber 23e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber#include <media/stagefright/foundation/ABuffer.h> 24e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber#include <media/stagefright/foundation/ADebug.h> 25e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber#include <media/stagefright/foundation/AMessage.h> 26e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber#include <media/stagefright/MediaBuffer.h> 27e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber#include <media/stagefright/MediaSource.h> 28e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber#include <media/stagefright/MetaData.h> 29e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber 30e1957358f11031a554c57d4fb46988dd6044acc1Andreas Hubernamespace android { 31e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber 32e1957358f11031a554c57d4fb46988dd6044acc1Andreas HuberMediaPuller::MediaPuller( 33e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber const sp<MediaSource> &source, const sp<AMessage> ¬ify) 34e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber : mSource(source), 35e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber mNotify(notify), 36e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber mPullGeneration(0) { 37e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber} 38e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber 39e1957358f11031a554c57d4fb46988dd6044acc1Andreas HuberMediaPuller::~MediaPuller() { 40e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber} 41e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber 42e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huberstatus_t MediaPuller::postSynchronouslyAndReturnError( 43e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber const sp<AMessage> &msg) { 44e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber sp<AMessage> response; 45e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber status_t err = msg->postAndAwaitResponse(&response); 46e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber 47e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber if (err != OK) { 48e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber return err; 49e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber } 50e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber 51e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber if (!response->findInt32("err", &err)) { 52e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber err = OK; 53e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber } 54e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber 55e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber return err; 56e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber} 57e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber 58e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huberstatus_t MediaPuller::start() { 59e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber return postSynchronouslyAndReturnError(new AMessage(kWhatStart, id())); 60e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber} 61e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber 62e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huberstatus_t MediaPuller::stop() { 63e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber return postSynchronouslyAndReturnError(new AMessage(kWhatStop, id())); 64e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber} 65e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber 66e1957358f11031a554c57d4fb46988dd6044acc1Andreas Hubervoid MediaPuller::onMessageReceived(const sp<AMessage> &msg) { 67e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber switch (msg->what()) { 68e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber case kWhatStart: 69e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber case kWhatStop: 70e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber { 71e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber status_t err; 72e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber 73e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber if (msg->what() == kWhatStart) { 74e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber err = mSource->start(); 75e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber 76e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber if (err == OK) { 77e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber schedulePull(); 78e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber } 79e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber } else { 80e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber err = mSource->stop(); 81e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber ++mPullGeneration; 82e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber } 83e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber 84e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber sp<AMessage> response = new AMessage; 85e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber response->setInt32("err", err); 86e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber 87e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber uint32_t replyID; 88e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 89e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber 90e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber response->postReply(replyID); 91e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber break; 92e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber } 93e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber 94e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber case kWhatPull: 95e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber { 96e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber int32_t generation; 97e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber CHECK(msg->findInt32("generation", &generation)); 98e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber 99e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber if (generation != mPullGeneration) { 100e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber break; 101e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber } 102e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber 103e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber MediaBuffer *mbuf; 104e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber status_t err = mSource->read(&mbuf); 105e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber 106e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber if (err != OK) { 107e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber if (err == ERROR_END_OF_STREAM) { 108e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber ALOGI("stream ended."); 109e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber } else { 110e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber ALOGE("error %d reading stream.", err); 111e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber } 112e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber 113e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber sp<AMessage> notify = mNotify->dup(); 114e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber notify->setInt32("what", kWhatEOS); 115e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber notify->post(); 116e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber } else { 117e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber int64_t timeUs; 118e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber CHECK(mbuf->meta_data()->findInt64(kKeyTime, &timeUs)); 119e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber 120e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber sp<ABuffer> accessUnit = new ABuffer(mbuf->range_length()); 121e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber 122e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber memcpy(accessUnit->data(), 123e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber (const uint8_t *)mbuf->data() + mbuf->range_offset(), 124e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber mbuf->range_length()); 125e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber 126e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber accessUnit->meta()->setInt64("timeUs", timeUs); 127e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber accessUnit->meta()->setPointer("mediaBuffer", mbuf); 128e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber 129e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber sp<AMessage> notify = mNotify->dup(); 130e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber 131e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber notify->setInt32("what", kWhatAccessUnit); 132e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber notify->setBuffer("accessUnit", accessUnit); 133e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber notify->post(); 134e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber 135e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber schedulePull(); 136e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber } 137e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber break; 138e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber } 139e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber 140e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber default: 141e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber TRESPASS(); 142e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber } 143e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber} 144e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber 145e1957358f11031a554c57d4fb46988dd6044acc1Andreas Hubervoid MediaPuller::schedulePull() { 146e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber sp<AMessage> msg = new AMessage(kWhatPull, id()); 147e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber msg->setInt32("generation", mPullGeneration); 148e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber msg->post(); 149e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber} 150e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber 151e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber} // namespace android 152e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber 153