Пример #1
0
static int dxva2_h264_start_frame(AVCodecContext *avctx,
                                  av_unused const uint8_t *buffer,
                                  av_unused uint32_t size)
{
    const H264Context *h = avctx->priv_data;
    AVDXVAContext *ctx = avctx->hwaccel_context;
    struct dxva2_picture_context *ctx_pic = h->cur_pic_ptr->hwaccel_picture_private;

    if (DXVA_CONTEXT_DECODER(avctx, ctx) == NULL ||
        DXVA_CONTEXT_CFG(avctx, ctx) == NULL ||
        DXVA_CONTEXT_COUNT(avctx, ctx) <= 0)
        return -1;
    assert(ctx_pic);

    /* Fill up DXVA_PicParams_H264 */
    fill_picture_parameters(avctx, ctx, h, &ctx_pic->pp);

    /* Fill up DXVA_Qmatrix_H264 */
    fill_scaling_lists(avctx, ctx, h, &ctx_pic->qm);

    ctx_pic->slice_count    = 0;
    ctx_pic->bitstream_size = 0;
    ctx_pic->bitstream      = NULL;
    return 0;
}
Пример #2
0
/** Initialize and start decoding a frame with VA API. */
static int vaapi_hevc_start_frame(AVCodecContext          *avctx,
                                  av_unused const uint8_t *buffer,
                                  av_unused uint32_t       size)
{
    HEVCContext * const h = avctx->priv_data;
    FFVAContext * const vactx = ff_vaapi_get_context(avctx);
    vaapi_hevc_frame_data *frame_data = h->ref->hwaccel_picture_private;
    VAPictureParameterBufferHEVC *pic_param;
    VAIQMatrixBufferHEVC *iq_matrix;
    ScalingList const * scaling_list;
    int i, j, pos;

    ff_dlog(avctx, "vaapi_hevc_start_frame()\n");

    vactx->slice_param_size = sizeof(VASliceParameterBufferHEVC);

    /* Fill in VAPictureParameterBufferHEVC. */
    pic_param = ff_vaapi_alloc_pic_param(vactx, sizeof(VAPictureParameterBufferHEVC));
    if (!pic_param)
        return -1;
    fill_picture_parameters(h, pic_param);
    frame_data->pic_param = pic_param;

    /* Fill in VAIQMatrixBufferHEVC. */
    if (h->ps.pps->scaling_list_data_present_flag) {
        scaling_list = &h->ps.pps->scaling_list;
    } else if (h->ps.sps->scaling_list_enable_flag) {
        scaling_list = &h->ps.sps->scaling_list;
    } else {
        return 0;
    }

    iq_matrix = ff_vaapi_alloc_iq_matrix(vactx, sizeof(VAIQMatrixBufferHEVC));
    if (!iq_matrix)
        return -1;

    for (i = 0; i < 6; ++i) {
        for (j = 0; j < 16; ++j) {
            pos = 4 * ff_hevc_diag_scan4x4_y[j] + ff_hevc_diag_scan4x4_x[j];
            iq_matrix->ScalingList4x4[i][j] = scaling_list->sl[0][i][pos];
        }
        for (j = 0; j < 64; ++j) {
            pos = 8 * ff_hevc_diag_scan8x8_y[j] + ff_hevc_diag_scan8x8_x[j];
            iq_matrix->ScalingList8x8[i][j] = scaling_list->sl[1][i][pos];
            iq_matrix->ScalingList16x16[i][j] = scaling_list->sl[2][i][pos];
            if (i < 2) {
                iq_matrix->ScalingList32x32[i][j] = scaling_list->sl[3][i * 3][pos];
            }
        }
        iq_matrix->ScalingListDC16x16[i] = scaling_list->sl_dc[0][i];
        if (i < 2) {
            iq_matrix->ScalingListDC32x32[i] = scaling_list->sl_dc[1][i * 3];
        }
    }

    return 0;
}
Пример #3
0
static int vaapi_vp9_start_frame(AVCodecContext          *avctx,
                                 av_unused const uint8_t *buffer,
                                 av_unused uint32_t       size)
{
    const VP9SharedContext *h = avctx->priv_data;
    FFVAContext * const vactx = ff_vaapi_get_context(avctx);
    VADecPictureParameterBufferVP9 *pic_param;

    vactx->slice_param_size = sizeof(VASliceParameterBufferVP9);

    pic_param = ff_vaapi_alloc_pic_param(vactx, sizeof(VADecPictureParameterBufferVP9));
    if (!pic_param)
        return -1;
    fill_picture_parameters(avctx, h, pic_param);

    return 0;
}
Пример #4
0
static int start_frame(AVCodecContext *avctx,
                       av_unused const uint8_t *buffer,
                       av_unused uint32_t size)
{
    const H264Context *h = avctx->priv_data;
    struct dxva_context *ctx = avctx->hwaccel_context;
    struct dxva2_picture_context *ctx_pic = h->s.current_picture_ptr->hwaccel_picture_private;

    if (!ctx->decoder || !ctx->cfg || ctx->surface_count <= 0)
        return -1;
    assert(ctx_pic);

    /* Fill up DXVA_PicParams_H264 */
    fill_picture_parameters(ctx, h, &ctx_pic->pp);

    /* Fill up DXVA_Qmatrix_H264 */
    fill_scaling_lists(h, &ctx_pic->qm);

    ctx_pic->slice_count    = 0;
    ctx_pic->bitstream_size = 0;
    ctx_pic->bitstream      = NULL;
    return 0;
}
Пример #5
0
static int dxva2_hevc_start_frame(AVCodecContext *avctx,
                                  av_unused const uint8_t *buffer,
                                  av_unused uint32_t size)
{
    const HEVCContext *h = avctx->priv_data;
    AVDXVAContext *ctx = DXVA_CONTEXT(avctx);
    struct hevc_dxva2_picture_context *ctx_pic = h->ref->hwaccel_picture_private;

    if (!DXVA_CONTEXT_VALID(avctx, ctx))
        return -1;
    av_assert0(ctx_pic);

    /* Fill up DXVA_PicParams_HEVC */
    fill_picture_parameters(avctx, ctx, h, &ctx_pic->pp);

    /* Fill up DXVA_Qmatrix_HEVC */
    fill_scaling_lists(ctx, h, &ctx_pic->qm);

    ctx_pic->slice_count    = 0;
    ctx_pic->bitstream_size = 0;
    ctx_pic->bitstream      = NULL;
    return 0;
}