Merge commit 'ce083282f0a8b7d63c4047c30b7bac498f9806dd'
authorMichael Niedermayer <michaelni@gmx.at>
Mon, 6 Oct 2014 10:32:07 +0000 (12:32 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Mon, 6 Oct 2014 10:38:26 +0000 (12:38 +0200)
* commit 'ce083282f0a8b7d63c4047c30b7bac498f9806dd':
  vdpau: common support for managing the VdpDecoder in avcodec

Conflicts:
libavcodec/vdpau.c

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
libavcodec/vdpau.c
libavcodec/vdpau_internal.h

@@@ -62,13 -64,68 +64,75 @@@ static int vdpau_error(VdpStatus status
      }
  }
  
 +AVVDPAUContext *av_alloc_vdpaucontext(void)
 +{
 +    return av_vdpau_alloc_context();
 +}
 +
 +MAKE_ACCESSORS(AVVDPAUContext, vdpau_hwaccel, AVVDPAU_Render2, render2)
 +
+ int ff_vdpau_common_init(AVCodecContext *avctx, VdpDecoderProfile profile,
+                          int level)
+ {
+     VDPAUHWContext *hwctx = avctx->hwaccel_context;
+     VDPAUContext *vdctx = avctx->internal->hwaccel_priv_data;
+     VdpDecoderCreate *create;
+     void *func;
+     VdpStatus status;
+     /* See vdpau/vdpau.h for alignment constraints. */
+     uint32_t width  = (avctx->coded_width + 1) & ~1;
+     uint32_t height = (avctx->coded_height + 3) & ~3;
+     if (hwctx->context.decoder != VDP_INVALID_HANDLE) {
+         vdctx->decoder = hwctx->context.decoder;
+         vdctx->render  = hwctx->context.render;
+         vdctx->device  = VDP_INVALID_HANDLE;
+         return 0; /* Decoder created by user */
+     }
+     vdctx->device           = hwctx->device;
+     vdctx->get_proc_address = hwctx->get_proc_address;
+     status = vdctx->get_proc_address(vdctx->device, VDP_FUNC_ID_DECODER_CREATE,
+                                      &func);
+     if (status != VDP_STATUS_OK)
+         return vdpau_error(status);
+     else
+         create = func;
+     status = vdctx->get_proc_address(vdctx->device, VDP_FUNC_ID_DECODER_RENDER,
+                                      &func);
+     if (status != VDP_STATUS_OK)
+         return vdpau_error(status);
+     else
+         vdctx->render = func;
+     status = create(vdctx->device, profile, width, height, avctx->refs,
+                     &vdctx->decoder);
+     return vdpau_error(status);
+ }
+ int ff_vdpau_common_uninit(AVCodecContext *avctx)
+ {
+     VDPAUContext *vdctx = avctx->internal->hwaccel_priv_data;
+     VdpDecoderDestroy *destroy;
+     void *func;
+     VdpStatus status;
+     if (vdctx->device == VDP_INVALID_HANDLE)
+         return 0; /* Decoder created and destroyed by user */
+     status = vdctx->get_proc_address(vdctx->device,
+                                      VDP_FUNC_ID_DECODER_DESTROY, &func);
+     if (status != VDP_STATUS_OK)
+         return vdpau_error(status);
+     else
+         destroy = func;
+     status = destroy(vdctx->decoder);
+     return vdpau_error(status);
+ }
  int ff_vdpau_common_start_frame(struct vdpau_picture_context *pic_ctx,
                                  av_unused const uint8_t *buffer,
                                  av_unused uint32_t size)
@@@ -76,8 -97,11 +104,13 @@@ struct vdpau_picture_context 
       */
      VdpBitstreamBuffer *bitstream_buffers;
  };
+ int ff_vdpau_common_init(AVCodecContext *avctx, VdpDecoderProfile profile,
+                          int level);
 +#endif
 +
+ int ff_vdpau_common_uninit(AVCodecContext *avctx);
  int ff_vdpau_common_start_frame(struct vdpau_picture_context *pic,
                                  const uint8_t *buffer, uint32_t size);
  int ff_vdpau_common_end_frame(AVCodecContext *avctx, AVFrame *frame,