Skip to content
This repository has been archived by the owner on Nov 30, 2023. It is now read-only.

Commit

Permalink
Merge pull request robherring#15 from pundiramit/master
Browse files Browse the repository at this point in the history
support video playback
  • Loading branch information
robherring authored Jun 29, 2020
2 parents 709726c + 13c5034 commit e0cd733
Show file tree
Hide file tree
Showing 3 changed files with 64 additions and 1 deletion.
14 changes: 14 additions & 0 deletions gralloc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,19 @@ static int gbm_mod_unlock(const gralloc_module_t *mod, buffer_handle_t handle)
return err;
}

static int gbm_mod_lock_ycbcr(gralloc_module_t const *mod, buffer_handle_t handle,
int usage, int x, int y, int w, int h, struct android_ycbcr *ycbcr)
{
struct gbm_module_t *dmod = (struct gbm_module_t *) mod;
int err;

pthread_mutex_lock(&dmod->mutex);
err = gralloc_gbm_bo_lock_ycbcr(handle, usage, x, y, w, h, ycbcr);
pthread_mutex_unlock(&dmod->mutex);

return err;
}

static int gbm_mod_close_gpu0(struct hw_device_t *dev)
{
struct gbm_module_t *dmod = (struct gbm_module_t *)dev->module;
Expand Down Expand Up @@ -251,6 +264,7 @@ struct gbm_module_t HAL_MODULE_INFO_SYM = {
.unregisterBuffer = gbm_mod_unregister_buffer,
.lock = gbm_mod_lock,
.unlock = gbm_mod_unlock,
.lock_ycbcr = gbm_mod_lock_ycbcr,
.perform = gbm_mod_perform
},

Expand Down
47 changes: 47 additions & 0 deletions gralloc_gbm.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -482,3 +482,50 @@ int gralloc_gbm_bo_unlock(buffer_handle_t handle)

return 0;
}

#define GRALLOC_ALIGN(value, base) (((value) + ((base)-1)) & ~((base)-1))

int gralloc_gbm_bo_lock_ycbcr(buffer_handle_t handle,
int usage, int x, int y, int w, int h,
struct android_ycbcr *ycbcr)
{
struct gralloc_handle_t *hnd = gralloc_handle(handle);
int ystride, cstride;
void *addr;
int err;

ALOGD("handle %p, hnd %p, usage 0x%x", handle, hnd, usage);

err = gralloc_gbm_bo_lock(handle, usage, x, y, w, h, &addr);
if (err)
return err;

memset(ycbcr->reserved, 0, sizeof(ycbcr->reserved));

switch (hnd->format) {
case HAL_PIXEL_FORMAT_YCrCb_420_SP:
ystride = cstride = GRALLOC_ALIGN(hnd->width, 16);
ycbcr->y = addr;
ycbcr->cr = (unsigned char *)addr + ystride * hnd->height;
ycbcr->cb = (unsigned char *)addr + ystride * hnd->height + 1;
ycbcr->ystride = ystride;
ycbcr->cstride = cstride;
ycbcr->chroma_step = 2;
break;
case HAL_PIXEL_FORMAT_YV12:
ystride = hnd->width;
cstride = GRALLOC_ALIGN(ystride / 2, 16);
ycbcr->y = addr;
ycbcr->cr = (unsigned char *)addr + ystride * hnd->height;
ycbcr->cb = (unsigned char *)addr + ystride * hnd->height + cstride * hnd->height / 2;
ycbcr->ystride = ystride;
ycbcr->cstride = cstride;
ycbcr->chroma_step = 1;
break;
default:
ALOGE("Can not lock buffer, invalid format: 0x%x", hnd->format);
return -EINVAL;
}

return 0;
}
4 changes: 3 additions & 1 deletion gralloc_gbm_priv.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,10 @@ struct gbm_bo *gralloc_gbm_bo_from_handle(buffer_handle_t handle);
buffer_handle_t gralloc_gbm_bo_get_handle(struct gbm_bo *bo);
int gralloc_gbm_get_gem_handle(buffer_handle_t handle);

int gralloc_gbm_bo_lock(buffer_handle_t handle, int x, int y, int w, int h, int enable_write, void **addr);
int gralloc_gbm_bo_lock(buffer_handle_t handle, int usage, int x, int y, int w, int h, void **addr);
int gralloc_gbm_bo_unlock(buffer_handle_t handle);
int gralloc_gbm_bo_lock_ycbcr(buffer_handle_t handle, int usage,
int x, int y, int w, int h, struct android_ycbcr *ycbcr);

struct gbm_device *gbm_dev_create(void);
void gbm_dev_destroy(struct gbm_device *gbm);
Expand Down

0 comments on commit e0cd733

Please sign in to comment.