summaryrefslogtreecommitdiff
path: root/src/decoder.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/decoder.c')
-rw-r--r--src/decoder.c48
1 files changed, 42 insertions, 6 deletions
diff --git a/src/decoder.c b/src/decoder.c
index 78f90a2..f27ec7e 100644
--- a/src/decoder.c
+++ b/src/decoder.c
@@ -53,7 +53,7 @@ static struct drm_tegra_bo *alloc_data(tegra_decoder *dec, void **map,
struct drm_tegra_bo *bo;
int ret;
- ret = drm_tegra_bo_new(&bo, dec->dev->drm, 0, size);
+ ret = drm_tegra_bo_new(&bo, dec->dev->drm, DRM_TEGRA_GEM_CONTIGUOUS, size);
if (ret < 0) {
return NULL;
@@ -66,13 +66,15 @@ static struct drm_tegra_bo *alloc_data(tegra_decoder *dec, void **map,
return NULL;
}
- ret = drm_tegra_bo_to_dmabuf(bo, (uint32_t *) dmabuf_fd);
+ ret = drm_tegra_bo_export(bo, 0);
if (ret < 0) {
drm_tegra_bo_unref(bo);
return NULL;
}
+ *dmabuf_fd = ret;
+
return bo;
}
@@ -174,6 +176,28 @@ static VdpStatus copy_bitstream_to_dmabuf(tegra_decoder *dec,
return VDP_STATUS_ERROR;
}
+static int setup_secure_data(tegra_decoder *dec, struct drm_tegra_bo **bop,
+ int *fdp)
+{
+ struct drm_tegra_bo *bo;
+ int err, fd;
+
+ err = drm_tegra_bo_new(&bo, dec->dev->drm, DRM_TEGRA_GEM_CONTIGUOUS, 4096);
+ if (err < 0)
+ return err;
+
+ fd = drm_tegra_bo_export(bo, 0);
+ if (fd < 0) {
+ drm_tegra_bo_unref(bo);
+ return fd;
+ }
+
+ *bop = bo;
+ *fdp = fd;
+
+ return 0;
+}
+
static int get_refs_sorted(struct tegra_vde_h264_frame *dpb_frames,
VdpReferenceFrameH264 const *referenceFrames,
int frame_num_wrap, int32_t max_frame_num,
@@ -371,7 +395,7 @@ static int get_slice_type(bitstream_reader *reader)
static VdpStatus tegra_decode_h264(tegra_decoder *dec, tegra_surface *surf,
VdpPictureInfoH264 const *info,
- int bitstream_data_fd,
+ int bitstream_data_fd, int secure_fd,
bitstream_reader *reader)
{
struct tegra_vde_h264_decoder_ctx ctx;
@@ -436,6 +460,8 @@ static VdpStatus tegra_decode_h264(tegra_decoder *dec, tegra_surface *surf,
ctx.bitstream_data_fd = bitstream_data_fd;
ctx.bitstream_data_offset = 0;
+ ctx.secure_fd = secure_fd;
+ ctx.secure_offset = 0;
ctx.dpb_frames_nb = 1 + refs_num;
ctx.dpb_frames_ptr = (uintptr_t) dpb_frames;
ctx.dpb_ref_frames_with_earlier_poc_nb = ref_frames_with_earlier_poc_num;
@@ -612,9 +638,9 @@ VdpStatus vdp_decoder_render(VdpDecoder decoder,
{
tegra_decoder *dec = get_decoder(decoder);
tegra_surface *orig, *surf = get_surface(target);
- struct drm_tegra_bo *bitstream_bo;
+ struct drm_tegra_bo *bitstream_bo, *secure_bo = NULL;
bitstream_reader bitstream_reader;
- int bitstream_data_fd;
+ int bitstream_data_fd, secure_fd = -1;
VdpStatus ret;
if (dec == NULL || surf == NULL) {
@@ -633,6 +659,14 @@ VdpStatus vdp_decoder_render(VdpDecoder decoder,
return ret;
}
+ ret = setup_secure_data(dec, &secure_bo, &secure_fd);
+ if (ret < 0) {
+ free_data(bitstream_bo, bitstream_data_fd);
+ put_surface(surf);
+ put_decoder(dec);
+ return VDP_STATUS_ERROR;
+ }
+
orig = surf;
surf = shared_surface_swap_video(surf);
@@ -642,9 +676,11 @@ VdpStatus vdp_decoder_render(VdpDecoder decoder,
}
ret = tegra_decode_h264(dec, surf, picture_info,
- bitstream_data_fd, &bitstream_reader);
+ bitstream_data_fd, secure_fd,
+ &bitstream_reader);
free_data(bitstream_bo, bitstream_data_fd);
+ free_data(secure_bo, secure_fd);
if (ret != VDP_STATUS_OK) {
put_surface(surf);