History

vdpau: force reinitialization when output resolution changes

This is necessary to recreate the decoder with the correct parameters, as not all codecs invoke get_format() in this case.

Rémi Denis-Courmont committed 12 years ago

Commit 502cde41 parent 89ac99b2 files · +32 −0Browse files

Unified · Split

2 files
  1. libavcodec/vdpau.c +29 −0
  2. libavcodec/vdpau_internal.h +3 −0
libavcodec/vdpau.c+29−0
@@ -76,6 +76,9 @@ int ff_vdpau_common_init(AVCodecContext *avctx, VdpDecoderProfile profile, · 75 unmodified lines
76 uint32_t width = (avctx->coded_width + 1) & ~1;76 uint32_t width = (avctx->coded_width + 1) & ~1;
77 uint32_t height = (avctx->coded_height + 3) & ~3;77 uint32_t height = (avctx->coded_height + 3) & ~3;
78 78
79 vdctx->width = UINT32_MAX;
80 vdctx->height = UINT32_MAX;
81
79 if (hwctx->context.decoder != VDP_INVALID_HANDLE) {82 if (hwctx->context.decoder != VDP_INVALID_HANDLE) {
80 vdctx->decoder = hwctx->context.decoder;83 vdctx->decoder = hwctx->context.decoder;
81 vdctx->render = hwctx->context.render;84 vdctx->render = hwctx->context.render;
@@ -102,6 +105,11 @@ int ff_vdpau_common_init(AVCodecContext *avctx, VdpDecoderProfile profile, · 20 unmodified lines
102 105
103 status = create(vdctx->device, profile, width, height, avctx->refs,106 status = create(vdctx->device, profile, width, height, avctx->refs,
104 &vdctx->decoder);107 &vdctx->decoder);
108 if (status == VDP_STATUS_OK) {
109 vdctx->width = avctx->coded_width;
110 vdctx->height = avctx->coded_height;
111 }
112
105 return vdpau_error(status);113 return vdpau_error(status);
106}114}
107 115
@@ -114,6 +122,8 @@ int ff_vdpau_common_uninit(AVCodecContext *avctx) · 6 unmodified lines
114 122
115 if (vdctx->device == VDP_INVALID_HANDLE)123 if (vdctx->device == VDP_INVALID_HANDLE)
116 return 0; /* Decoder created and destroyed by user */124 return 0; /* Decoder created and destroyed by user */
125 if (vdctx->width == UINT32_MAX && vdctx->height == UINT32_MAX)
126 return 0;
117 127
118 status = vdctx->get_proc_address(vdctx->device,128 status = vdctx->get_proc_address(vdctx->device,
119 VDP_FUNC_ID_DECODER_DESTROY, &func);129 VDP_FUNC_ID_DECODER_DESTROY, &func);
@@ -126,6 +136,20 @@ int ff_vdpau_common_uninit(AVCodecContext *avctx) · 6 unmodified lines
126 return vdpau_error(status);136 return vdpau_error(status);
127}137}
128 138
139static int ff_vdpau_common_reinit(AVCodecContext *avctx)
140{
141 VDPAUContext *vdctx = avctx->internal->hwaccel_priv_data;
142
143 if (vdctx->device == VDP_INVALID_HANDLE)
144 return 0; /* Decoder created by user */
145 if (avctx->coded_width == vdctx->width &&
146 avctx->coded_height == vdctx->height)
147 return 0;
148
149 avctx->hwaccel->uninit(avctx);
150 return avctx->hwaccel->init(avctx);
151}
152
129int ff_vdpau_common_start_frame(struct vdpau_picture_context *pic_ctx,153int ff_vdpau_common_start_frame(struct vdpau_picture_context *pic_ctx,
130 av_unused const uint8_t *buffer,154 av_unused const uint8_t *buffer,
131 av_unused uint32_t size)155 av_unused uint32_t size)
@@ -142,6 +166,11 @@ int ff_vdpau_common_end_frame(AVCodecContext *avctx, AVFrame *frame, · 10 unmodified lines
142 VDPAUContext *vdctx = avctx->internal->hwaccel_priv_data;166 VDPAUContext *vdctx = avctx->internal->hwaccel_priv_data;
143 VdpVideoSurface surf = ff_vdpau_get_surface_id(frame);167 VdpVideoSurface surf = ff_vdpau_get_surface_id(frame);
144 VdpStatus status;168 VdpStatus status;
169 int val;
170
171 val = ff_vdpau_common_reinit(avctx);
172 if (val < 0)
173 return val;
145 174
146 status = vdctx->render(vdctx->decoder, surf, (void *)&pic_ctx->info,175 status = vdctx->render(vdctx->decoder, surf, (void *)&pic_ctx->info,
147 pic_ctx->bitstream_buffers_used,176 pic_ctx->bitstream_buffers_used,
libavcodec/vdpau_internal.h+3−0
@@ -74,6 +74,9 @@ typedef struct VDPAUContext { · 73 unmodified lines
74 * VDPAU decoder render callback74 * VDPAU decoder render callback
75 */75 */
76 VdpDecoderRender *render;76 VdpDecoderRender *render;
77
78 uint32_t width;
79 uint32_t height;
77} VDPAUContext;80} VDPAUContext;
78 81
79struct vdpau_picture_context {82struct vdpau_picture_context {

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t