hwc: Add support to smooth streaming feature.
update the source video width and height set by the video decoder
for secure video smooth streaming usecase from metadata.
Change-Id: I73a3804d90557034604142481a232787dbc08f23
diff --git a/libhwcomposer/hwc_copybit.cpp b/libhwcomposer/hwc_copybit.cpp
index ba40db5..912da27 100644
--- a/libhwcomposer/hwc_copybit.cpp
+++ b/libhwcomposer/hwc_copybit.cpp
@@ -246,8 +246,8 @@
rect.bottom};
copybit_image_t buf;
- buf.w = ALIGN(hnd->width,32);
- buf.h = hnd->height;
+ buf.w = ALIGN(getWidth(hnd),32);
+ buf.h = getHeight(hnd);
buf.format = hnd->format;
buf.base = (void *)hnd->base;
buf.handle = (native_handle_t *)hnd;
@@ -347,8 +347,8 @@
// Set the copybit source:
copybit_image_t src;
- src.w = hnd->width;
- src.h = hnd->height;
+ src.w = getWidth(hnd);
+ src.h = getHeight(hnd);
src.format = hnd->format;
// Handle R/B swap
@@ -362,7 +362,7 @@
src.base = (void *)hnd->base;
src.handle = (native_handle_t *)layer->handle;
- src.horiz_padding = src.w - hnd->width;
+ src.horiz_padding = src.w - getWidth(hnd);
// Initialize vertical padding to zero for now,
// this needs to change to accomodate vertical stride
// if needed in the future
diff --git a/libhwcomposer/hwc_dump_layers.cpp b/libhwcomposer/hwc_dump_layers.cpp
index b9c09b6..1b3d097 100644
--- a/libhwcomposer/hwc_dump_layers.cpp
+++ b/libhwcomposer/hwc_dump_layers.cpp
@@ -236,7 +236,7 @@
// Log Line 1
ALOGI("Display[%s] Layer[%d] SrcBuff[%dx%d] SrcCrop[%dl, %dt, %dr, %db] "
"DispFrame[%dl, %dt, %dr, %db] VisRegsScr%s", mDisplayName, layerIndex,
- (hnd)? hnd->width : -1, (hnd)? hnd->height : -1,
+ (hnd)? getWidth(hnd) : -1, (hnd)? getHeight(hnd) : -1,
sourceCrop.left, sourceCrop.top,
sourceCrop.right, sourceCrop.bottom,
displayFrame.left, displayFrame.top,
@@ -328,7 +328,7 @@
break;
}
if (SkBitmap::kNo_Config != tempSkBmpConfig) {
- tempSkBmp->setConfig(tempSkBmpConfig, hnd->width, hnd->height);
+ tempSkBmp->setConfig(tempSkBmpConfig, getWidth(hnd), getHeight(hnd));
tempSkBmp->setPixels((void*)hnd->base);
bResult = SkImageEncoder::EncodeFile(dumpFilename,
*tempSkBmp, SkImageEncoder::kPNG_Type, 100);
@@ -348,7 +348,7 @@
bool bResult = false;
sprintf(dumpFilename, "%s/sfdump%03d.layer%d.%dx%d.%s.%s.raw",
mDumpDirRaw, mDumpCntrRaw,
- layerIndex, hnd->width, hnd->height,
+ layerIndex, getWidth(hnd), getHeight(hnd),
pixFormatStr, mDisplayName);
FILE* fp = fopen(dumpFilename, "w+");
if (NULL != fp) {
diff --git a/libhwcomposer/hwc_fbupdate.cpp b/libhwcomposer/hwc_fbupdate.cpp
index 53b3d18..12177b3 100644
--- a/libhwcomposer/hwc_fbupdate.cpp
+++ b/libhwcomposer/hwc_fbupdate.cpp
@@ -106,7 +106,7 @@
}
overlay::Overlay& ov = *(ctx->mOverlay);
private_handle_t *hnd = (private_handle_t *)layer->handle;
- ovutils::Whf info(hnd->width, hnd->height,
+ ovutils::Whf info(getWidth(hnd), getHeight(hnd),
ovutils::getMdpFormat(hnd->format), hnd->size);
//Request a pipe
@@ -244,7 +244,7 @@
}
overlay::Overlay& ov = *(ctx->mOverlay);
private_handle_t *hnd = (private_handle_t *)layer->handle;
- ovutils::Whf info(hnd->width, hnd->height,
+ ovutils::Whf info(getWidth(hnd), getHeight(hnd),
ovutils::getMdpFormat(hnd->format), hnd->size);
//Request left pipe
diff --git a/libhwcomposer/hwc_utils.cpp b/libhwcomposer/hwc_utils.cpp
index 7e0ecd8..bf88834 100644
--- a/libhwcomposer/hwc_utils.cpp
+++ b/libhwcomposer/hwc_utils.cpp
@@ -1389,7 +1389,7 @@
eTransform orient = static_cast<eTransform>(transform);
int downscale = 0;
int rotFlags = ovutils::ROT_FLAGS_NONE;
- Whf whf(hnd->width, hnd->height,
+ Whf whf(getWidth(hnd), getHeight(hnd),
getMdpFormat(hnd->format), hnd->size);
// Handle R/B swap
@@ -1520,7 +1520,7 @@
const int downscale = 0;
int rotFlags = ROT_FLAGS_NONE;
- Whf whf(hnd->width, hnd->height,
+ Whf whf(getWidth(hnd), getHeight(hnd),
getMdpFormat(hnd->format), hnd->size);
// Handle R/B swap
diff --git a/libhwcomposer/hwc_utils.h b/libhwcomposer/hwc_utils.h
index 3f1aace..182cdb4 100644
--- a/libhwcomposer/hwc_utils.h
+++ b/libhwcomposer/hwc_utils.h
@@ -316,6 +316,26 @@
return (hnd && (hnd->flags & private_handle_t::PRIV_FLAGS_SECURE_DISPLAY));
}
+static inline int getWidth(const private_handle_t* hnd) {
+ if(isYuvBuffer(hnd)) {
+ MetaData_t *metadata = (MetaData_t *)hnd->base_metadata;
+ if(metadata && metadata->operation & UPDATE_BUFFER_GEOMETRY) {
+ return metadata->bufferDim.sliceWidth;
+ }
+ }
+ return hnd->width;
+}
+
+static inline int getHeight(const private_handle_t* hnd) {
+ if(isYuvBuffer(hnd)) {
+ MetaData_t *metadata = (MetaData_t *)hnd->base_metadata;
+ if(metadata && metadata->operation & UPDATE_BUFFER_GEOMETRY) {
+ return metadata->bufferDim.sliceHeight;
+ }
+ }
+ return hnd->height;
+}
+
template<typename T> inline T max(T a, T b) { return (a > b) ? a : b; }
template<typename T> inline T min(T a, T b) { return (a < b) ? a : b; }
diff --git a/libqdutils/qdMetaData.cpp b/libqdutils/qdMetaData.cpp
index 1316e59..89ca92e 100644
--- a/libqdutils/qdMetaData.cpp
+++ b/libqdutils/qdMetaData.cpp
@@ -78,6 +78,9 @@
case PP_PARAM_TIMESTAMP:
data->timestamp = *((int64_t *)param);
break;
+ case UPDATE_BUFFER_GEOMETRY:
+ memcpy((void *)&data->bufferDim, param, sizeof(BufferDim_t));
+ break;
default:
ALOGE("Unknown paramType %d", paramType);
break;
diff --git a/libqdutils/qdMetaData.h b/libqdutils/qdMetaData.h
index 9f10cf8..d5354a4 100644
--- a/libqdutils/qdMetaData.h
+++ b/libqdutils/qdMetaData.h
@@ -52,9 +52,15 @@
uint16_t c2[MAX_IGC_LUT_ENTRIES];
};
+struct BufferDim_t {
+ int32_t sliceWidth;
+ int32_t sliceHeight;
+};
+
struct MetaData_t {
int32_t operation;
int32_t interlaced;
+ BufferDim_t bufferDim;
HSICData_t hsicData;
int32_t sharpness;
int32_t video_interface;
@@ -70,7 +76,8 @@
PP_PARAM_VID_INTFC = 0x0008,
PP_PARAM_IGC = 0x0010,
PP_PARAM_SHARP2 = 0x0020,
- PP_PARAM_TIMESTAMP = 0x0040
+ PP_PARAM_TIMESTAMP = 0x0040,
+ UPDATE_BUFFER_GEOMETRY = 0x0080,
} DispParamType;
int setMetaData(private_handle_t *handle, DispParamType paramType, void *param);