Ticket #10062: workaround-for-qsv-av1-timestamp-issue.patch

File workaround-for-qsv-av1-timestamp-issue.patch, 9.0 KB (added by oviano, 4 years ago)

Patch file for workaround for FFmpeg git master

  • libavcodec/qsvenc.c

    diff --git a/libavcodec/qsvenc.c b/libavcodec/qsvenc.c
    index d5e9f2d..92f6e68 100644
    a b  
    4242#include "qsv.h"
    4343#include "qsv_internal.h"
    4444#include "qsvenc.h"
     45#include "get_bits.h"
     46#include "av1.h"
    4547
    4648struct profile_names {
    4749    mfxU16 profile;
    int ff_qsv_enc_init(AVCodecContext *avctx, QSVEncContext *q)  
    15031505    if (!q->async_fifo)
    15041506        return AVERROR(ENOMEM);
    15051507
     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
    15061518    if (avctx->hwaccel_context) {
    15071519        AVQSVContext *qsv = avctx->hwaccel_context;
    15081520
    static int submit_frame(QSVEncContext *q, const AVFrame *frame,  
    18521864            return ret;
    18531865        }
    18541866    }
    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 });
    18561873
    18571874    *new_frame = qf;
    18581875
    nomem:  
    23652382    goto free;
    23662383}
    23672384
     2385static 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
    23682405int ff_qsv_encode(AVCodecContext *avctx, QSVEncContext *q,
    23692406                  AVPacket *pkt, const AVFrame *frame, int *got_packet)
    23702407{
    int ff_qsv_encode(AVCodecContext *avctx, QSVEncContext *q,  
    23912428            ret = MFXVideoCORE_SyncOperation(q->session, *qpkt.sync, 1000);
    23922429        } while (ret == MFX_WRN_IN_EXECUTION);
    23932430
    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);
    23962431        qpkt.pkt.size = qpkt.bs->DataLength;
    23972432
    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            }
    24102471        } 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);
    24142474
    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;
    24222506        }
     2507
    24232508        av_freep(&qpkt.bs);
    24242509        av_freep(&qpkt.sync);
     2510    }
    24252511
    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        }
    24292523    }
    24302524
    24312525    return 0;
    int ff_qsv_enc_close(AVCodecContext *avctx, QSVEncContext *q)  
    24692563        av_fifo_freep2(&q->async_fifo);
    24702564    }
    24712565
     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
    24722578#if QSV_HAVE_OPAQUE
    24732579    av_freep(&q->opaque_surfaces);
    24742580    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 {  
    186186    mfxExtBuffer **extparam;
    187187
    188188    AVFifo *async_fifo;
     189    AVFifo* input_pts;
     190    AVFifo* output_pkts;
     191    AVPacket current_pkt;
    189192
    190193    QSVFramesContext frames_ctx;
    191194