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) {
}
virtual status_t initCheck() const {
return OK;
}
virtual void render(MediaBuffer *buffer) {
void *id;
if (buffer->meta_data()->findPointer(kKeyBufferID, &id)) {
@@ -105,14 +109,19 @@ struct AwesomeLocalRenderer : public AwesomeRenderer {
size_t displayWidth, size_t displayHeight,
size_t decodedWidth, size_t decodedHeight,
int32_t rotationDegrees)
: mTarget(NULL),
: mInitCheck(NO_INIT),
mTarget(NULL),
mLibHandle(NULL) {
init(previewOnly, componentName,
mInitCheck = init(previewOnly, componentName,
colorFormat, surface, displayWidth,
displayHeight, decodedWidth, decodedHeight,
rotationDegrees);
}
virtual status_t initCheck() const {
return mInitCheck;
}
virtual void render(MediaBuffer *buffer) {
render((const uint8_t *)buffer->data() + buffer->range_offset(),
buffer->range_length());
@@ -134,10 +143,11 @@ protected:
}
private:
status_t mInitCheck;
VideoRenderer *mTarget;
void *mLibHandle;
void init(
status_t init(
bool previewOnly,
const char *componentName,
OMX_COLOR_FORMATTYPE colorFormat,
@@ -150,7 +160,7 @@ private:
AwesomeLocalRenderer &operator=(const AwesomeLocalRenderer &);;
};
void AwesomeLocalRenderer::init(
status_t AwesomeLocalRenderer::init(
bool previewOnly,
const char *componentName,
OMX_COLOR_FORMATTYPE colorFormat,
@@ -215,11 +225,15 @@ void AwesomeLocalRenderer::init(
}
}
if (mTarget == NULL) {
mTarget = new SoftwareRenderer(
colorFormat, surface, displayWidth, displayHeight,
decodedWidth, decodedHeight, rotationDegrees);
if (mTarget != NULL) {
return OK;
}
mTarget = new SoftwareRenderer(
colorFormat, surface, displayWidth, displayHeight,
decodedWidth, decodedHeight, rotationDegrees);
return ((SoftwareRenderer *)mTarget)->initCheck();
}
AwesomePlayer::AwesomePlayer()
@@ -804,53 +818,64 @@ status_t AwesomePlayer::play_l() {
return OK;
}
void AwesomePlayer::initRenderer_l() {
if (mISurface != NULL) {
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.
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);
}
status_t AwesomePlayer::initRenderer_l() {
if (mISurface == NULL) {
return OK;
}
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() {
@@ -1179,9 +1204,14 @@ void AwesomePlayer::onVideoEvent() {
if (mVideoRenderer != NULL) {
mVideoRendererIsPreview = false;
initRenderer_l();
err = initRenderer_l();
if (err == OK) {
continue;
}
// fall through
}
continue;
}
// So video playback is complete, but we may still have
@@ -1265,7 +1295,15 @@ void AwesomePlayer::onVideoEvent() {
if (mVideoRendererIsPreview || mVideoRenderer == NULL) {
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) {

View File

@@ -32,7 +32,8 @@ SoftwareRenderer::SoftwareRenderer(
size_t displayWidth, size_t displayHeight,
size_t decodedWidth, size_t decodedHeight,
int32_t rotationDegrees)
: mColorFormat(colorFormat),
: mInitCheck(NO_INIT),
mColorFormat(colorFormat),
mConverter(colorFormat, OMX_COLOR_Format16bitRGB565),
mISurface(surface),
mDisplayWidth(displayWidth),
@@ -74,15 +75,28 @@ SoftwareRenderer::SoftwareRenderer(
mMemoryHeap);
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() {
mISurface->unregisterBuffers();
}
status_t SoftwareRenderer::initCheck() const {
return mInitCheck;
}
void SoftwareRenderer::render(
const void *data, size_t size, void *platformPrivate) {
if (mInitCheck != OK) {
return;
}
size_t offset = mIndex * mFrameSize;
void *dst = (uint8_t *)mMemoryHeap->getBase() + offset;

View File

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

View File

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

View File

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