Showing the changes to libavcodec (2 of 2 files). Show all
Unified · Split
| @@ -44,6 +44,7 @@ typedef struct NVDECDecoder { · 43 unmodified lines | ||
| 44 | 44 | CUvideodecoder decoder; |
| 45 | 45 | |
| 46 | 46 | AVBufferRef *hw_device_ref; |
| 47 | + AVBufferRef *real_hw_frames_ref; | |
| 47 | 48 | CUcontext cuda_ctx; |
| 48 | 49 | CUstream stream; |
| 49 | 50 | |
| @@ -163,6 +164,7 @@ static void nvdec_decoder_free(void *opaque, uint8_t *data) · 113 unmodified lines | ||
| 163 | 164 | CHECK_CU(decoder->cudl->cuCtxPopCurrent(&dummy)); |
| 164 | 165 | } |
| 165 | 166 | |
| 167 | + av_buffer_unref(&decoder->real_hw_frames_ref); | |
| 166 | 168 | av_buffer_unref(&decoder->hw_device_ref); |
| 167 | 169 | |
| 168 | 170 | cuvid_free_functions(&decoder->cvdl); |
| @@ -269,10 +271,61 @@ int ff_nvdec_decode_uninit(AVCodecContext *avctx) · 100 unmodified lines | ||
| 269 | 271 | return 0; |
| 270 | 272 | } |
| 271 | 273 | |
| 274 | +static void nvdec_free_dummy(struct AVHWFramesContext *ctx) | |
| 275 | +{ | |
| 276 | + av_buffer_pool_uninit(&ctx->pool); | |
| 277 | +} | |
| 278 | + | |
| 279 | +static AVBufferRef *nvdec_alloc_dummy(int size) | |
| 280 | +{ | |
| 281 | + return av_buffer_create(NULL, 0, NULL, NULL, 0); | |
| 282 | +} | |
| 283 | + | |
| 284 | +static int nvdec_init_hwframes(AVCodecContext *avctx, AVBufferRef **out_frames_ref, int dummy) | |
| 285 | +{ | |
| 286 | + AVHWFramesContext *frames_ctx; | |
| 287 | + int ret; | |
| 288 | + | |
| 289 | + ret = avcodec_get_hw_frames_parameters(avctx, | |
| 290 | + avctx->hw_device_ctx, | |
| 291 | + avctx->hwaccel->pix_fmt, | |
| 292 | + out_frames_ref); | |
| 293 | + if (ret < 0) | |
| 294 | + return ret; | |
| 295 | + | |
| 296 | + frames_ctx = (AVHWFramesContext*)(*out_frames_ref)->data; | |
| 297 | + | |
| 298 | + if (dummy) { | |
| 299 | + // Copied from ff_decode_get_hw_frames_ctx for compatibility | |
| 300 | + frames_ctx->initial_pool_size += 3; | |
| 301 | + | |
| 302 | + frames_ctx->free = nvdec_free_dummy; | |
| 303 | + frames_ctx->pool = av_buffer_pool_init(0, nvdec_alloc_dummy); | |
| 304 | + | |
| 305 | + if (!frames_ctx->pool) { | |
| 306 | + av_buffer_unref(out_frames_ref); | |
| 307 | + return AVERROR(ENOMEM); | |
| 308 | + } | |
| 309 | + } else { | |
| 310 | + // This is normally not used to actually allocate frames from | |
| 311 | + frames_ctx->initial_pool_size = 0; | |
| 312 | + } | |
| 313 | + | |
| 314 | + ret = av_hwframe_ctx_init(*out_frames_ref); | |
| 315 | + if (ret < 0) { | |
| 316 | + av_buffer_unref(out_frames_ref); | |
| 317 | + return ret; | |
| 318 | + } | |
| 319 | + | |
| 320 | + return 0; | |
| 321 | +} | |
| 322 | + | |
| 272 | 323 | int ff_nvdec_decode_init(AVCodecContext *avctx) |
| 273 | 324 | { |
| 274 | 325 | NVDECContext *ctx = avctx->internal->hwaccel_priv_data; |
| 275 | 326 | |
| 327 | + NVDECDecoder *decoder; | |
| 328 | + AVBufferRef *real_hw_frames_ref; | |
| 276 | 329 | NVDECFramePool *pool; |
| 277 | 330 | AVHWFramesContext *frames_ctx; |
| 278 | 331 | const AVPixFmtDescriptor *sw_desc; |
| @@ -301,9 +354,17 @@ int ff_nvdec_decode_init(AVCodecContext *avctx) · 22 unmodified lines | ||
| 301 | 354 | chroma_444 = ctx->supports_444 && cuvid_chroma_format == cudaVideoChromaFormat_444; |
| 302 | 355 | |
| 303 | 356 | if (!avctx->hw_frames_ctx) { |
| 304 | − ret = ff_decode_get_hw_frames_ctx(avctx, AV_HWDEVICE_TYPE_CUDA); | |
| 357 | + ret = nvdec_init_hwframes(avctx, &avctx->hw_frames_ctx, 1); | |
| 358 | + if (ret < 0) | |
| 359 | + return ret; | |
| 360 | + | |
| 361 | + ret = nvdec_init_hwframes(avctx, &real_hw_frames_ref, 0); | |
| 305 | 362 | if (ret < 0) |
| 306 | 363 | return ret; |
| 364 | + } else { | |
| 365 | + real_hw_frames_ref = av_buffer_ref(avctx->hw_frames_ctx); | |
| 366 | + if (!real_hw_frames_ref) | |
| 367 | + return AVERROR(ENOMEM); | |
| 307 | 368 | } |
| 308 | 369 | |
| 309 | 370 | switch (sw_desc->comp[0].depth) { |
| @@ -318,6 +379,7 @@ int ff_nvdec_decode_init(AVCodecContext *avctx) · 8 unmodified lines | ||
| 318 | 379 | break; |
| 319 | 380 | default: |
| 320 | 381 | av_log(avctx, AV_LOG_ERROR, "Unsupported bit depth\n"); |
| 382 | + av_buffer_unref(&real_hw_frames_ref); | |
| 321 | 383 | return AVERROR(ENOSYS); |
| 322 | 384 | } |
| 323 | 385 | |
| @@ -342,9 +404,14 @@ int ff_nvdec_decode_init(AVCodecContext *avctx) · 18 unmodified lines | ||
| 342 | 404 | av_log(avctx, AV_LOG_WARNING, "Try lowering the amount of threads. Using %d right now.\n", |
| 343 | 405 | avctx->thread_count); |
| 344 | 406 | } |
| 407 | + av_buffer_unref(&real_hw_frames_ref); | |
| 345 | 408 | return ret; |
| 346 | 409 | } |
| 347 | 410 | |
| 411 | + decoder = (NVDECDecoder*)ctx->decoder_ref->data; | |
| 412 | + decoder->real_hw_frames_ref = real_hw_frames_ref; | |
| 413 | + real_hw_frames_ref = NULL; | |
| 414 | + | |
| 348 | 415 | pool = av_mallocz(sizeof(*pool)); |
| 349 | 416 | if (!pool) { |
| 350 | 417 | ret = AVERROR(ENOMEM); |
| @@ -447,6 +514,13 @@ static int nvdec_retrieve_data(void *logctx, AVFrame *frame) · 96 unmodified lines | ||
| 447 | 514 | goto copy_fail; |
| 448 | 515 | } |
| 449 | 516 | |
| 517 | + av_buffer_unref(&frame->hw_frames_ctx); | |
| 518 | + frame->hw_frames_ctx = av_buffer_ref(decoder->real_hw_frames_ref); | |
| 519 | + if (!frame->hw_frames_ctx) { | |
| 520 | + ret = AVERROR(ENOMEM); | |
| 521 | + goto copy_fail; | |
| 522 | + } | |
| 523 | + | |
| 450 | 524 | unmap_data->idx = cf->idx; |
| 451 | 525 | unmap_data->idx_ref = av_buffer_ref(cf->idx_ref); |
| 452 | 526 | unmap_data->decoder_ref = av_buffer_ref(cf->decoder_ref); |
| @@ -575,16 +649,6 @@ int ff_nvdec_simple_decode_slice(AVCodecContext *avctx, const uint8_t *buffer, · 122 unmodified lines | ||
| 575 | 649 | return 0; |
| 576 | 650 | } |
| 577 | 651 | |
| 578 | −static void nvdec_free_dummy(struct AVHWFramesContext *ctx) | |
| 579 | −{ | |
| 580 | − av_buffer_pool_uninit(&ctx->pool); | |
| 581 | −} | |
| 582 | − | |
| 583 | −static AVBufferRef *nvdec_alloc_dummy(int size) | |
| 584 | −{ | |
| 585 | − return av_buffer_create(NULL, 0, NULL, NULL, 0); | |
| 586 | −} | |
| 587 | − | |
| 588 | 652 | int ff_nvdec_frame_params(AVCodecContext *avctx, |
| 589 | 653 | AVBufferRef *hw_frames_ctx, |
| 590 | 654 | int dpb_size, |
| @@ -620,12 +684,6 @@ int ff_nvdec_frame_params(AVCodecContext *avctx, · 29 unmodified lines | ||
| 620 | 684 | */ |
| 621 | 685 | frames_ctx->initial_pool_size = dpb_size + 2; |
| 622 | 686 | |
| 623 | − frames_ctx->free = nvdec_free_dummy; | |
| 624 | − frames_ctx->pool = av_buffer_pool_init(0, nvdec_alloc_dummy); | |
| 625 | − | |
| 626 | − if (!frames_ctx->pool) | |
| 627 | − return AVERROR(ENOMEM); | |
| 628 | − | |
| 629 | 687 | switch (sw_desc->comp[0].depth) { |
| 630 | 688 | case 8: |
| 631 | 689 | frames_ctx->sw_format = chroma_444 ? AV_PIX_FMT_YUV444P : AV_PIX_FMT_NV12; |
| @@ -29,7 +29,7 @@ · 28 unmodified lines | ||
| 29 | 29 | |
| 30 | 30 | #define LIBAVCODEC_VERSION_MAJOR 58 |
| 31 | 31 | #define LIBAVCODEC_VERSION_MINOR 77 |
| 32 | −#define LIBAVCODEC_VERSION_MICRO 100 | |
| 32 | +#define LIBAVCODEC_VERSION_MICRO 101 | |
| 33 | 33 | |
| 34 | 34 | #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ |
| 35 | 35 | LIBAVCODEC_VERSION_MINOR, \ |