Ticket #10062: workaround-for-qsv-av1-timestamp-issue.patch
| File workaround-for-qsv-av1-timestamp-issue.patch, 9.0 KB (added by , 4 years ago) |
|---|
-
libavcodec/qsvenc.c
diff --git a/libavcodec/qsvenc.c b/libavcodec/qsvenc.c index d5e9f2d..92f6e68 100644
a b 42 42 #include "qsv.h" 43 43 #include "qsv_internal.h" 44 44 #include "qsvenc.h" 45 #include "get_bits.h" 46 #include "av1.h" 45 47 46 48 struct profile_names { 47 49 mfxU16 profile; … … int ff_qsv_enc_init(AVCodecContext *avctx, QSVEncContext *q) 1503 1505 if (!q->async_fifo) 1504 1506 return AVERROR(ENOMEM); 1505 1507 1508 if (avctx->codec_id == AV_CODEC_ID_AV1) { 1509 q->input_pts = av_fifo_alloc2(8, sizeof(int64_t), AV_FIFO_FLAG_AUTO_GROW); 1510 if (!q->input_pts) 1511 return AVERROR(ENOMEM); 1512 q->output_pkts = av_fifo_alloc2(8, sizeof(AVPacket), AV_FIFO_FLAG_AUTO_GROW); 1513 if (!q->output_pkts) 1514 return AVERROR(ENOMEM); 1515 av_packet_unref(&q->current_pkt); 1516 } 1517 1506 1518 if (avctx->hwaccel_context) { 1507 1519 AVQSVContext *qsv = avctx->hwaccel_context; 1508 1520 … … static int submit_frame(QSVEncContext *q, const AVFrame *frame, 1852 1864 return ret; 1853 1865 } 1854 1866 } 1855 qf->surface.Data.TimeStamp = av_rescale_q(frame->pts, q->avctx->time_base, (AVRational){1, 90000}); 1867 1868 if (q->avctx->codec_id == AV_CODEC_ID_AV1) { 1869 av_fifo_write(q->input_pts, &frame->pts, 1); 1870 } 1871 else 1872 qf->surface.Data.TimeStamp = av_rescale_q(frame->pts, q->avctx->time_base, (AVRational) { 1, 90000 }); 1856 1873 1857 1874 *new_frame = qf; 1858 1875 … … nomem: 2365 2382 goto free; 2366 2383 } 2367 2384 2385 static unsigned get_uleb128(GetBitContext* const c, int* error) { 2386 uint64_t val = 0; 2387 unsigned i = 0, more; 2388 *error = 0; 2389 2390 do { 2391 const int v = get_bits(c, 8); 2392 more = v & 0x80; 2393 val |= ((uint64_t)(v & 0x7F)) << i; 2394 i += 7; 2395 } while (more && i < 56); 2396 2397 if (val > UINT_MAX || more) { 2398 *error = 1; 2399 return 0; 2400 } 2401 2402 return (unsigned)val; 2403 } 2404 2368 2405 int ff_qsv_encode(AVCodecContext *avctx, QSVEncContext *q, 2369 2406 AVPacket *pkt, const AVFrame *frame, int *got_packet) 2370 2407 { … … int ff_qsv_encode(AVCodecContext *avctx, QSVEncContext *q, 2391 2428 ret = MFXVideoCORE_SyncOperation(q->session, *qpkt.sync, 1000); 2392 2429 } while (ret == MFX_WRN_IN_EXECUTION); 2393 2430 2394 qpkt.pkt.dts = av_rescale_q(qpkt.bs->DecodeTimeStamp, (AVRational){1, 90000}, avctx->time_base);2395 qpkt.pkt.pts = av_rescale_q(qpkt.bs->TimeStamp, (AVRational){1, 90000}, avctx->time_base);2396 2431 qpkt.pkt.size = qpkt.bs->DataLength; 2397 2432 2398 if (qpkt.bs->FrameType & MFX_FRAMETYPE_IDR || qpkt.bs->FrameType & MFX_FRAMETYPE_xIDR) { 2399 qpkt.pkt.flags |= AV_PKT_FLAG_KEY; 2400 pict_type = AV_PICTURE_TYPE_I; 2401 } else if (qpkt.bs->FrameType & MFX_FRAMETYPE_I || qpkt.bs->FrameType & MFX_FRAMETYPE_xI) 2402 pict_type = AV_PICTURE_TYPE_I; 2403 else if (qpkt.bs->FrameType & MFX_FRAMETYPE_P || qpkt.bs->FrameType & MFX_FRAMETYPE_xP) 2404 pict_type = AV_PICTURE_TYPE_P; 2405 else if (qpkt.bs->FrameType & MFX_FRAMETYPE_B || qpkt.bs->FrameType & MFX_FRAMETYPE_xB) 2406 pict_type = AV_PICTURE_TYPE_B; 2407 else if (qpkt.bs->FrameType == MFX_FRAMETYPE_UNKNOWN) { 2408 pict_type = AV_PICTURE_TYPE_NONE; 2409 av_log(avctx, AV_LOG_WARNING, "Unknown FrameType, set pict_type to AV_PICTURE_TYPE_NONE.\n"); 2433 if (avctx->codec_id == AV_CODEC_ID_AV1) { 2434 GetBitContext gbc; 2435 init_get_bits(&gbc, qpkt.pkt.data, qpkt.pkt.size * 8); 2436 while (get_bits_left(&gbc) > 0) { 2437 int start_index = gbc.index; 2438 get_bits(&gbc, 1); 2439 const enum AV1_OBU_Type type = (enum AV1_OBU_Type)get_bits(&gbc, 4); 2440 const int has_extension = get_bits(&gbc, 1); 2441 const int has_length_field = get_bits(&gbc, 1); 2442 get_bits(&gbc, 1); 2443 int temporal_id = 0, spatial_id = 0; 2444 if (has_extension) { 2445 temporal_id = get_bits(&gbc, 3); 2446 spatial_id = get_bits(&gbc, 2); 2447 get_bits(&gbc, 3); 2448 } 2449 int error = 0; 2450 const unsigned len = has_length_field ? 2451 get_uleb128(&gbc, &error) : qpkt.pkt.size - 1 - has_extension; 2452 skip_bits(&gbc, len * 8); 2453 2454 if (type == AV1_OBU_TEMPORAL_DELIMITER) { 2455 if (q->current_pkt.size > 0) { 2456 AVPacket tmp = { 0 }; 2457 av_packet_move_ref(&tmp, &q->current_pkt); 2458 av_fifo_write(q->output_pkts, &tmp, 1); 2459 } 2460 av_fifo_read(q->input_pts, &q->current_pkt.pts, 1); 2461 q->current_pkt.dts = q->current_pkt.pts; 2462 if (qpkt.bs->FrameType & MFX_FRAMETYPE_IDR || qpkt.bs->FrameType & MFX_FRAMETYPE_xIDR) 2463 q->current_pkt.flags |= AV_PKT_FLAG_KEY; 2464 } 2465 2466 int start_offset = start_index >> 3; 2467 int append_bytes = (gbc.index - start_index) >> 3; 2468 av_grow_packet(&q->current_pkt, append_bytes); 2469 memcpy((uint8_t*)q->current_pkt.data + q->current_pkt.size - append_bytes, gbc.buffer + start_offset, append_bytes); 2470 } 2410 2471 } else { 2411 av_log(avctx, AV_LOG_ERROR, "Invalid FrameType:%d.\n", qpkt.bs->FrameType); 2412 return AVERROR_INVALIDDATA; 2413 } 2472 qpkt.pkt.dts = av_rescale_q(qpkt.bs->DecodeTimeStamp, (AVRational) { 1, 90000 }, avctx->time_base); 2473 qpkt.pkt.pts = av_rescale_q(qpkt.bs->TimeStamp, (AVRational) { 1, 90000 }, avctx->time_base); 2414 2474 2415 if (avctx->codec_id == AV_CODEC_ID_H264) { 2416 enc_buf = qpkt.bs->ExtParam; 2417 enc_info = (mfxExtAVCEncodedFrameInfo *)(*enc_buf); 2418 ff_side_data_set_encoder_stats(&qpkt.pkt, 2419 enc_info->QP * FF_QP2LAMBDA, NULL, 0, pict_type); 2420 av_freep(&enc_info); 2421 av_freep(&enc_buf); 2475 if (qpkt.bs->FrameType & MFX_FRAMETYPE_IDR || qpkt.bs->FrameType & MFX_FRAMETYPE_xIDR) { 2476 qpkt.pkt.flags |= AV_PKT_FLAG_KEY; 2477 pict_type = AV_PICTURE_TYPE_I; 2478 } 2479 else if (qpkt.bs->FrameType & MFX_FRAMETYPE_I || qpkt.bs->FrameType & MFX_FRAMETYPE_xI) 2480 pict_type = AV_PICTURE_TYPE_I; 2481 else if (qpkt.bs->FrameType & MFX_FRAMETYPE_P || qpkt.bs->FrameType & MFX_FRAMETYPE_xP) 2482 pict_type = AV_PICTURE_TYPE_P; 2483 else if (qpkt.bs->FrameType & MFX_FRAMETYPE_B || qpkt.bs->FrameType & MFX_FRAMETYPE_xB) 2484 pict_type = AV_PICTURE_TYPE_B; 2485 else if (qpkt.bs->FrameType == MFX_FRAMETYPE_UNKNOWN) { 2486 pict_type = AV_PICTURE_TYPE_NONE; 2487 av_log(avctx, AV_LOG_WARNING, "Unknown FrameType, set pict_type to AV_PICTURE_TYPE_NONE.\n"); 2488 } 2489 else { 2490 av_log(avctx, AV_LOG_ERROR, "Invalid FrameType:%d.\n", qpkt.bs->FrameType); 2491 return AVERROR_INVALIDDATA; 2492 } 2493 2494 if (avctx->codec_id == AV_CODEC_ID_H264) { 2495 enc_buf = qpkt.bs->ExtParam; 2496 enc_info = (mfxExtAVCEncodedFrameInfo*)(*enc_buf); 2497 ff_side_data_set_encoder_stats(&qpkt.pkt, 2498 enc_info->QP * FF_QP2LAMBDA, NULL, 0, pict_type); 2499 av_freep(&enc_info); 2500 av_freep(&enc_buf); 2501 } 2502 2503 av_packet_move_ref(pkt, &qpkt.pkt); 2504 2505 *got_packet = 1; 2422 2506 } 2507 2423 2508 av_freep(&qpkt.bs); 2424 2509 av_freep(&qpkt.sync); 2510 } 2425 2511 2426 av_packet_move_ref(pkt, &qpkt.pkt); 2427 2428 *got_packet = 1; 2512 if (q->avctx->codec_id == AV_CODEC_ID_AV1) { 2513 if (av_fifo_can_read(q->output_pkts) > 0) { 2514 AVPacket tmp = { 0 }; 2515 av_fifo_read(q->output_pkts, &tmp, 1); 2516 av_packet_move_ref(pkt, &tmp); 2517 *got_packet = 1; 2518 } 2519 else if (!frame && !av_fifo_can_read(q->async_fifo) && q->current_pkt.size > 0) { 2520 av_packet_move_ref(pkt, &q->current_pkt); 2521 *got_packet = 1; 2522 } 2429 2523 } 2430 2524 2431 2525 return 0; … … int ff_qsv_enc_close(AVCodecContext *avctx, QSVEncContext *q) 2469 2563 av_fifo_freep2(&q->async_fifo); 2470 2564 } 2471 2565 2566 if (avctx->codec_id == AV_CODEC_ID_AV1) { 2567 av_fifo_freep2(&q->input_pts); 2568 if (q->output_pkts) { 2569 AVPacket pkt; 2570 while (av_fifo_read(q->output_pkts, &pkt, 1) >= 0) { 2571 av_packet_unref(&pkt); 2572 } 2573 av_fifo_freep2(&q->output_pkts); 2574 } 2575 av_packet_unref(&q->current_pkt); 2576 } 2577 2472 2578 #if QSV_HAVE_OPAQUE 2473 2579 av_freep(&q->opaque_surfaces); 2474 2580 av_buffer_unref(&q->opaque_alloc_buf); -
libavcodec/qsvenc.h
diff --git a/libavcodec/qsvenc.h b/libavcodec/qsvenc.h index a7bbb37..386b8dc 100644
a b typedef struct QSVEncContext { 186 186 mfxExtBuffer **extparam; 187 187 188 188 AVFifo *async_fifo; 189 AVFifo* input_pts; 190 AVFifo* output_pkts; 191 AVPacket current_pkt; 189 192 190 193 QSVFramesContext frames_ctx; 191 194
