stream.cpp revision e2b1028852120bcfded33b8f06f66b780437fe92
1e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber#include <binder/ProcessState.h> 2e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 3e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber#include <media/IStreamSource.h> 4e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber#include <media/mediaplayer.h> 5e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber#include <media/stagefright/foundation/ADebug.h> 6e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 7e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber#include <binder/IServiceManager.h> 8e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber#include <media/IMediaPlayerService.h> 9e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber#include <surfaceflinger/ISurfaceComposer.h> 10e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber#include <surfaceflinger/SurfaceComposerClient.h> 11e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 12e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber#include <fcntl.h> 13e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 14e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huberusing namespace android; 15e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 16e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huberstruct MyStreamSource : public BnStreamSource { 17e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber // Caller retains ownership of fd. 18e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber MyStreamSource(int fd); 19e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 20e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber virtual void setListener(const sp<IStreamListener> &listener); 21e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber virtual void setBuffers(const Vector<sp<IMemory> > &buffers); 22e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 23e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber virtual void onBufferAvailable(size_t index); 24e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 25e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huberprotected: 26e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber virtual ~MyStreamSource(); 27e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 28e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huberprivate: 29e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber int mFd; 30e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 31e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber sp<IStreamListener> mListener; 32e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber Vector<sp<IMemory> > mBuffers; 33e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 34e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(MyStreamSource); 35e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber}; 36e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 37e2b1028852120bcfded33b8f06f66b780437fe92Andreas HuberMyStreamSource::MyStreamSource(int fd) 38e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber : mFd(fd) { 39e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber CHECK_GE(fd, 0); 40e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber} 41e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 42e2b1028852120bcfded33b8f06f66b780437fe92Andreas HuberMyStreamSource::~MyStreamSource() { 43e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber} 44e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 45e2b1028852120bcfded33b8f06f66b780437fe92Andreas Hubervoid MyStreamSource::setListener(const sp<IStreamListener> &listener) { 46e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber mListener = listener; 47e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber} 48e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 49e2b1028852120bcfded33b8f06f66b780437fe92Andreas Hubervoid MyStreamSource::setBuffers(const Vector<sp<IMemory> > &buffers) { 50e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber mBuffers = buffers; 51e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber} 52e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 53e2b1028852120bcfded33b8f06f66b780437fe92Andreas Hubervoid MyStreamSource::onBufferAvailable(size_t index) { 54e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber CHECK_LT(index, mBuffers.size()); 55e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber sp<IMemory> mem = mBuffers.itemAt(index); 56e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 57e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber ssize_t n = read(mFd, mem->pointer(), mem->size()); 58e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber if (n <= 0) { 59e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber mListener->queueCommand(IStreamListener::EOS); 60e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber } else { 61e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber mListener->queueBuffer(index, n); 62e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber } 63e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber} 64e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 65e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber//////////////////////////////////////////////////////////////////////////////// 66e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 67e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huberstruct MyClient : public BnMediaPlayerClient { 68e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber MyClient() 69e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber : mEOS(false) { 70e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber } 71e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 72e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber virtual void notify(int msg, int ext1, int ext2) { 73e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber Mutex::Autolock autoLock(mLock); 74e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 75e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber if (msg == MEDIA_ERROR || msg == MEDIA_PLAYBACK_COMPLETE) { 76e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber mEOS = true; 77e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber mCondition.signal(); 78e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber } 79e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber } 80e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 81e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber void waitForEOS() { 82e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber Mutex::Autolock autoLock(mLock); 83e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber while (!mEOS) { 84e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber mCondition.wait(mLock); 85e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber } 86e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber } 87e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 88e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huberprotected: 89e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber virtual ~MyClient() { 90e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber } 91e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 92e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huberprivate: 93e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber Mutex mLock; 94e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber Condition mCondition; 95e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 96e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber bool mEOS; 97e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 98e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(MyClient); 99e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber}; 100e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 101e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huberint main(int argc, char **argv) { 102e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber android::ProcessState::self()->startThreadPool(); 103e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 104e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber if (argc != 2) { 105e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber fprintf(stderr, "Usage: %s filename\n", argv[0]); 106e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber return 1; 107e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber } 108e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 109e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber sp<SurfaceComposerClient> composerClient = new SurfaceComposerClient; 110e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber CHECK_EQ(composerClient->initCheck(), (status_t)OK); 111e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 112e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber sp<SurfaceControl> control = 113e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber composerClient->createSurface( 114e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber getpid(), 115e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber String8("A Surface"), 116e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 0, 117e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 1280, 118e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 800, 119e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber PIXEL_FORMAT_RGB_565, 120e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 0); 121e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 122e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber CHECK(control != NULL); 123e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber CHECK(control->isValid()); 124e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 125e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber CHECK_EQ(composerClient->openTransaction(), (status_t)OK); 126e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber CHECK_EQ(control->setLayer(30000), (status_t)OK); 127e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber CHECK_EQ(control->show(), (status_t)OK); 128e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber CHECK_EQ(composerClient->closeTransaction(), (status_t)OK); 129e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 130e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber sp<Surface> surface = control->getSurface(); 131e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber CHECK(surface != NULL); 132e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 133e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber sp<IServiceManager> sm = defaultServiceManager(); 134e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber sp<IBinder> binder = sm->getService(String16("media.player")); 135e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber sp<IMediaPlayerService> service = interface_cast<IMediaPlayerService>(binder); 136e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 137e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber CHECK(service.get() != NULL); 138e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 139e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber int fd = open(argv[1], O_RDONLY); 140e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 141e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber if (fd < 0) { 142e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber fprintf(stderr, "Failed to open file '%s'.", argv[1]); 143e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber return 1; 144e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber } 145e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 146e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber sp<MyClient> client = new MyClient; 147e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 148e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber sp<IMediaPlayer> player = 149e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber service->create(getpid(), client, new MyStreamSource(fd), 0); 150e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 151e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber if (player != NULL) { 152e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber player->setVideoSurface(surface); 153e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber player->start(); 154e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 155e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber client->waitForEOS(); 156e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 157e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber player->stop(); 158e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber } else { 159e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber fprintf(stderr, "failed to instantiate player.\n"); 160e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber } 161e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 162e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber close(fd); 163e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber fd = -1; 164e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 165e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber composerClient->dispose(); 166e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 167e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber return 0; 168e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber} 169