am bc96c284: Merge "For thumbnail extraction make sure we instantiate a decoder that allows access to the framebuffer. Implement the samsung workaround to support this by reconfiguring the decoder." into gingerbread
Merge commit 'bc96c2848dadaa844f95e89708d9941f73bbf400' into gingerbread-plus-aosp * commit 'bc96c2848dadaa844f95e89708d9941f73bbf400': For thumbnail extraction make sure we instantiate a decoder that allows access to the framebuffer. Implement the samsung workaround to support this by reconfiguring the decoder.
This commit is contained in:
@@ -33,7 +33,11 @@ struct OMXCodec : public MediaSource,
|
|||||||
public MediaBufferObserver {
|
public MediaBufferObserver {
|
||||||
enum CreationFlags {
|
enum CreationFlags {
|
||||||
kPreferSoftwareCodecs = 1,
|
kPreferSoftwareCodecs = 1,
|
||||||
kIgnoreCodecSpecificData = 2
|
kIgnoreCodecSpecificData = 2,
|
||||||
|
|
||||||
|
// The client wants to access the output buffer's video
|
||||||
|
// data for example for thumbnail extraction.
|
||||||
|
kClientNeedsFramebuffer = 4,
|
||||||
};
|
};
|
||||||
static sp<MediaSource> Create(
|
static sp<MediaSource> Create(
|
||||||
const sp<IOMX> &omx,
|
const sp<IOMX> &omx,
|
||||||
|
|||||||
@@ -493,12 +493,29 @@ sp<MediaSource> OMXCodec::Create(
|
|||||||
|
|
||||||
LOGV("Attempting to allocate OMX node '%s'", componentName);
|
LOGV("Attempting to allocate OMX node '%s'", componentName);
|
||||||
|
|
||||||
|
uint32_t quirks = getComponentQuirks(componentName, createEncoder);
|
||||||
|
|
||||||
|
if (!createEncoder
|
||||||
|
&& (quirks & kOutputBuffersAreUnreadable)
|
||||||
|
&& (flags & kClientNeedsFramebuffer)) {
|
||||||
|
if (strncmp(componentName, "OMX.SEC.", 8)) {
|
||||||
|
// For OMX.SEC.* decoders we can enable a special mode that
|
||||||
|
// gives the client access to the framebuffer contents.
|
||||||
|
|
||||||
|
LOGW("Component '%s' does not give the client access to "
|
||||||
|
"the framebuffer contents. Skipping.",
|
||||||
|
componentName);
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
status_t err = omx->allocateNode(componentName, observer, &node);
|
status_t err = omx->allocateNode(componentName, observer, &node);
|
||||||
if (err == OK) {
|
if (err == OK) {
|
||||||
LOGV("Successfully allocated OMX node '%s'", componentName);
|
LOGV("Successfully allocated OMX node '%s'", componentName);
|
||||||
|
|
||||||
sp<OMXCodec> codec = new OMXCodec(
|
sp<OMXCodec> codec = new OMXCodec(
|
||||||
omx, node, getComponentQuirks(componentName, createEncoder),
|
omx, node, quirks,
|
||||||
createEncoder, mime, componentName,
|
createEncoder, mime, componentName,
|
||||||
source);
|
source);
|
||||||
|
|
||||||
@@ -681,6 +698,33 @@ status_t OMXCodec::configureCodec(const sp<MetaData> &meta, uint32_t flags) {
|
|||||||
|
|
||||||
initOutputFormat(meta);
|
initOutputFormat(meta);
|
||||||
|
|
||||||
|
if ((flags & kClientNeedsFramebuffer)
|
||||||
|
&& !strncmp(mComponentName, "OMX.SEC.", 8)) {
|
||||||
|
OMX_INDEXTYPE index;
|
||||||
|
|
||||||
|
status_t err =
|
||||||
|
mOMX->getExtensionIndex(
|
||||||
|
mNode,
|
||||||
|
"OMX.SEC.index.ThumbnailMode",
|
||||||
|
&index);
|
||||||
|
|
||||||
|
if (err != OK) {
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
OMX_BOOL enable = OMX_TRUE;
|
||||||
|
err = mOMX->setConfig(mNode, index, &enable, sizeof(enable));
|
||||||
|
|
||||||
|
if (err != OK) {
|
||||||
|
CODEC_LOGE("setConfig('OMX.SEC.index.ThumbnailMode') "
|
||||||
|
"returned error 0x%08x", err);
|
||||||
|
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
mQuirks &= ~kOutputBuffersAreUnreadable;
|
||||||
|
}
|
||||||
|
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -112,7 +112,7 @@ static VideoFrame *extractVideoFrameWithCodecFlags(
|
|||||||
sp<MediaSource> decoder =
|
sp<MediaSource> decoder =
|
||||||
OMXCodec::Create(
|
OMXCodec::Create(
|
||||||
client->interface(), source->getFormat(), false, source,
|
client->interface(), source->getFormat(), false, source,
|
||||||
NULL, flags);
|
NULL, flags | OMXCodec::kClientNeedsFramebuffer);
|
||||||
|
|
||||||
if (decoder.get() == NULL) {
|
if (decoder.get() == NULL) {
|
||||||
LOGV("unable to instantiate video decoder.");
|
LOGV("unable to instantiate video decoder.");
|
||||||
|
|||||||
Reference in New Issue
Block a user