Merge "DO NOT MERGE - Instead of asserting that ISurface successfully registered buffers, report an error and propagate it up to the java client." into gingerbread

This commit is contained in:
Andreas Huber
2010-11-30 11:42:22 -08:00
committed by Android (Google) Code Review
5 changed files with 123 additions and 60 deletions

View File

@@ -82,6 +82,10 @@ struct AwesomeRemoteRenderer : public AwesomeRenderer {
: mTarget(target) { : mTarget(target) {
} }
virtual status_t initCheck() const {
return OK;
}
virtual void render(MediaBuffer *buffer) { virtual void render(MediaBuffer *buffer) {
void *id; void *id;
if (buffer->meta_data()->findPointer(kKeyBufferID, &id)) { if (buffer->meta_data()->findPointer(kKeyBufferID, &id)) {
@@ -105,14 +109,19 @@ struct AwesomeLocalRenderer : public AwesomeRenderer {
size_t displayWidth, size_t displayHeight, size_t displayWidth, size_t displayHeight,
size_t decodedWidth, size_t decodedHeight, size_t decodedWidth, size_t decodedHeight,
int32_t rotationDegrees) int32_t rotationDegrees)
: mTarget(NULL), : mInitCheck(NO_INIT),
mTarget(NULL),
mLibHandle(NULL) { mLibHandle(NULL) {
init(previewOnly, componentName, mInitCheck = init(previewOnly, componentName,
colorFormat, surface, displayWidth, colorFormat, surface, displayWidth,
displayHeight, decodedWidth, decodedHeight, displayHeight, decodedWidth, decodedHeight,
rotationDegrees); rotationDegrees);
} }
virtual status_t initCheck() const {
return mInitCheck;
}
virtual void render(MediaBuffer *buffer) { virtual void render(MediaBuffer *buffer) {
render((const uint8_t *)buffer->data() + buffer->range_offset(), render((const uint8_t *)buffer->data() + buffer->range_offset(),
buffer->range_length()); buffer->range_length());
@@ -134,10 +143,11 @@ protected:
} }
private: private:
status_t mInitCheck;
VideoRenderer *mTarget; VideoRenderer *mTarget;
void *mLibHandle; void *mLibHandle;
void init( status_t init(
bool previewOnly, bool previewOnly,
const char *componentName, const char *componentName,
OMX_COLOR_FORMATTYPE colorFormat, OMX_COLOR_FORMATTYPE colorFormat,
@@ -150,7 +160,7 @@ private:
AwesomeLocalRenderer &operator=(const AwesomeLocalRenderer &);; AwesomeLocalRenderer &operator=(const AwesomeLocalRenderer &);;
}; };
void AwesomeLocalRenderer::init( status_t AwesomeLocalRenderer::init(
bool previewOnly, bool previewOnly,
const char *componentName, const char *componentName,
OMX_COLOR_FORMATTYPE colorFormat, OMX_COLOR_FORMATTYPE colorFormat,
@@ -215,11 +225,15 @@ void AwesomeLocalRenderer::init(
} }
} }
if (mTarget == NULL) { if (mTarget != NULL) {
mTarget = new SoftwareRenderer( return OK;
colorFormat, surface, displayWidth, displayHeight,
decodedWidth, decodedHeight, rotationDegrees);
} }
mTarget = new SoftwareRenderer(
colorFormat, surface, displayWidth, displayHeight,
decodedWidth, decodedHeight, rotationDegrees);
return ((SoftwareRenderer *)mTarget)->initCheck();
} }
AwesomePlayer::AwesomePlayer() AwesomePlayer::AwesomePlayer()
@@ -804,53 +818,64 @@ status_t AwesomePlayer::play_l() {
return OK; return OK;
} }
void AwesomePlayer::initRenderer_l() { status_t AwesomePlayer::initRenderer_l() {
if (mISurface != NULL) { if (mISurface == NULL) {
sp<MetaData> meta = mVideoSource->getFormat(); return OK;
int32_t format;
const char *component;
int32_t decodedWidth, decodedHeight;
CHECK(meta->findInt32(kKeyColorFormat, &format));
CHECK(meta->findCString(kKeyDecoderComponent, &component));
CHECK(meta->findInt32(kKeyWidth, &decodedWidth));
CHECK(meta->findInt32(kKeyHeight, &decodedHeight));
int32_t rotationDegrees;
if (!mVideoTrack->getFormat()->findInt32(
kKeyRotation, &rotationDegrees)) {
rotationDegrees = 0;
}
mVideoRenderer.clear();
// Must ensure that mVideoRenderer's destructor is actually executed
// before creating a new one.
IPCThreadState::self()->flushCommands();
if (!strncmp("OMX.", component, 4)) {
// Our OMX codecs allocate buffers on the media_server side
// therefore they require a remote IOMXRenderer that knows how
// to display them.
mVideoRenderer = new AwesomeRemoteRenderer(
mClient.interface()->createRenderer(
mISurface, component,
(OMX_COLOR_FORMATTYPE)format,
decodedWidth, decodedHeight,
mVideoWidth, mVideoHeight,
rotationDegrees));
} else {
// Other decoders are instantiated locally and as a consequence
// allocate their buffers in local address space.
mVideoRenderer = new AwesomeLocalRenderer(
false, // previewOnly
component,
(OMX_COLOR_FORMATTYPE)format,
mISurface,
mVideoWidth, mVideoHeight,
decodedWidth, decodedHeight, rotationDegrees);
}
} }
sp<MetaData> meta = mVideoSource->getFormat();
int32_t format;
const char *component;
int32_t decodedWidth, decodedHeight;
CHECK(meta->findInt32(kKeyColorFormat, &format));
CHECK(meta->findCString(kKeyDecoderComponent, &component));
CHECK(meta->findInt32(kKeyWidth, &decodedWidth));
CHECK(meta->findInt32(kKeyHeight, &decodedHeight));
int32_t rotationDegrees;
if (!mVideoTrack->getFormat()->findInt32(
kKeyRotation, &rotationDegrees)) {
rotationDegrees = 0;
}
mVideoRenderer.clear();
// Must ensure that mVideoRenderer's destructor is actually executed
// before creating a new one.
IPCThreadState::self()->flushCommands();
if (!strncmp("OMX.", component, 4)) {
// Our OMX codecs allocate buffers on the media_server side
// therefore they require a remote IOMXRenderer that knows how
// to display them.
sp<IOMXRenderer> native =
mClient.interface()->createRenderer(
mISurface, component,
(OMX_COLOR_FORMATTYPE)format,
decodedWidth, decodedHeight,
mVideoWidth, mVideoHeight,
rotationDegrees);
if (native == NULL) {
return NO_INIT;
}
mVideoRenderer = new AwesomeRemoteRenderer(native);
} else {
// Other decoders are instantiated locally and as a consequence
// allocate their buffers in local address space.
mVideoRenderer = new AwesomeLocalRenderer(
false, // previewOnly
component,
(OMX_COLOR_FORMATTYPE)format,
mISurface,
mVideoWidth, mVideoHeight,
decodedWidth, decodedHeight, rotationDegrees);
}
return mVideoRenderer->initCheck();
} }
status_t AwesomePlayer::pause() { status_t AwesomePlayer::pause() {
@@ -1179,9 +1204,14 @@ void AwesomePlayer::onVideoEvent() {
if (mVideoRenderer != NULL) { if (mVideoRenderer != NULL) {
mVideoRendererIsPreview = false; mVideoRendererIsPreview = false;
initRenderer_l(); err = initRenderer_l();
if (err == OK) {
continue;
}
// fall through
} }
continue;
} }
// So video playback is complete, but we may still have // So video playback is complete, but we may still have
@@ -1265,7 +1295,15 @@ void AwesomePlayer::onVideoEvent() {
if (mVideoRendererIsPreview || mVideoRenderer == NULL) { if (mVideoRendererIsPreview || mVideoRenderer == NULL) {
mVideoRendererIsPreview = false; mVideoRendererIsPreview = false;
initRenderer_l(); status_t err = initRenderer_l();
if (err != OK) {
finishSeekIfNecessary(-1);
mFlags |= VIDEO_AT_EOS;
postStreamDoneEvent_l(err);
return;
}
} }
if (mVideoRenderer != NULL) { if (mVideoRenderer != NULL) {

View File

@@ -32,7 +32,8 @@ SoftwareRenderer::SoftwareRenderer(
size_t displayWidth, size_t displayHeight, size_t displayWidth, size_t displayHeight,
size_t decodedWidth, size_t decodedHeight, size_t decodedWidth, size_t decodedHeight,
int32_t rotationDegrees) int32_t rotationDegrees)
: mColorFormat(colorFormat), : mInitCheck(NO_INIT),
mColorFormat(colorFormat),
mConverter(colorFormat, OMX_COLOR_Format16bitRGB565), mConverter(colorFormat, OMX_COLOR_Format16bitRGB565),
mISurface(surface), mISurface(surface),
mDisplayWidth(displayWidth), mDisplayWidth(displayWidth),
@@ -74,15 +75,28 @@ SoftwareRenderer::SoftwareRenderer(
mMemoryHeap); mMemoryHeap);
status_t err = mISurface->registerBuffers(bufferHeap); status_t err = mISurface->registerBuffers(bufferHeap);
CHECK_EQ(err, OK);
if (err != OK) {
LOGW("ISurface failed to register buffers (0x%08x)", err);
}
mInitCheck = err;
} }
SoftwareRenderer::~SoftwareRenderer() { SoftwareRenderer::~SoftwareRenderer() {
mISurface->unregisterBuffers(); mISurface->unregisterBuffers();
} }
status_t SoftwareRenderer::initCheck() const {
return mInitCheck;
}
void SoftwareRenderer::render( void SoftwareRenderer::render(
const void *data, size_t size, void *platformPrivate) { const void *data, size_t size, void *platformPrivate) {
if (mInitCheck != OK) {
return;
}
size_t offset = mIndex * mFrameSize; size_t offset = mIndex * mFrameSize;
void *dst = (uint8_t *)mMemoryHeap->getBase() + offset; void *dst = (uint8_t *)mMemoryHeap->getBase() + offset;

View File

@@ -44,6 +44,7 @@ struct UDPPusher;
struct AwesomeRenderer : public RefBase { struct AwesomeRenderer : public RefBase {
AwesomeRenderer() {} AwesomeRenderer() {}
virtual status_t initCheck() const = 0;
virtual void render(MediaBuffer *buffer) = 0; virtual void render(MediaBuffer *buffer) = 0;
private: private:
@@ -225,7 +226,7 @@ private:
void partial_reset_l(); void partial_reset_l();
status_t seekTo_l(int64_t timeUs); status_t seekTo_l(int64_t timeUs);
status_t pause_l(bool at_eos = false); status_t pause_l(bool at_eos = false);
void initRenderer_l(); status_t initRenderer_l();
void seekAudioIfNecessary_l(); void seekAudioIfNecessary_l();
void cancelPlayerEvents(bool keepBufferingGoing = false); void cancelPlayerEvents(bool keepBufferingGoing = false);

View File

@@ -38,10 +38,13 @@ public:
virtual ~SoftwareRenderer(); virtual ~SoftwareRenderer();
status_t initCheck() const;
virtual void render( virtual void render(
const void *data, size_t size, void *platformPrivate); const void *data, size_t size, void *platformPrivate);
private: private:
status_t mInitCheck;
OMX_COLOR_FORMATTYPE mColorFormat; OMX_COLOR_FORMATTYPE mColorFormat;
ColorConverter mConverter; ColorConverter mConverter;
sp<ISurface> mISurface; sp<ISurface> mISurface;

View File

@@ -525,6 +525,13 @@ sp<IOMXRenderer> OMX::createRenderer(
surface, surface,
displayWidth, displayHeight, displayWidth, displayHeight,
encodedWidth, encodedHeight); encodedWidth, encodedHeight);
if (((SoftwareRenderer *)impl)->initCheck() != OK) {
delete impl;
impl = NULL;
return NULL;
}
} }
return new OMXRenderer(impl); return new OMXRenderer(impl);