diff options
Diffstat (limited to 'src/decoder.c')
-rw-r--r-- | src/decoder.c | 48 |
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); |