X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fvaapi_h264.c;h=83bf2907de645c9df470ac8c367d0abf62d73950;hb=f255a28d140a64ea4c1a5060061863aec993b5ea;hp=265cd3f1d284e9ed2a017da736595c429b1f16fc;hpb=07c9f6f673a3e5699b703a26fc86da6e7ff107ee;p=ffmpeg diff --git a/libavcodec/vaapi_h264.c b/libavcodec/vaapi_h264.c index 265cd3f1d28..83bf2907de6 100644 --- a/libavcodec/vaapi_h264.c +++ b/libavcodec/vaapi_h264.c @@ -3,20 +3,20 @@ * * Copyright (C) 2008-2009 Splitted-Desktop Systems * - * This file is part of FFmpeg. + * This file is part of Libav. * - * FFmpeg is free software; you can redistribute it and/or + * Libav is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * - * FFmpeg is distributed in the hope that it will be useful, + * Libav is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with FFmpeg; if not, write to the Free Software + * License along with Libav; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ @@ -24,25 +24,12 @@ #include "h264.h" /** @file - * This file implements the glue code between FFmpeg's and VA API's + * This file implements the glue code between Libav's and VA API's * structures for H.264 decoding. */ -/** Reconstructs bitstream slice_type. */ -static int get_slice_type(H264Context *h) -{ - switch (h->slice_type) { - case FF_P_TYPE: return 0; - case FF_B_TYPE: return 1; - case FF_I_TYPE: return 2; - case FF_SP_TYPE: return 3; - case FF_SI_TYPE: return 4; - default: return -1; - } -} - /** - * Initializes an empty VA API picture. + * Initialize an empty VA API picture. * * VA API requires a fixed-size reference picture array. */ @@ -55,10 +42,10 @@ static void init_vaapi_pic(VAPictureH264 *va_pic) } /** - * Translates an FFmpeg Picture into its VA API form. + * Translate an Libav Picture into its VA API form. * * @param[out] va_pic A pointer to VA API's own picture struct - * @param[in] pic A pointer to the FFmpeg picture struct to convert + * @param[in] pic A pointer to the Libav picture struct to convert * @param[in] pic_structure The picture field type (as defined in mpegvideo.h), * supersedes pic's field type if nonzero. */ @@ -68,6 +55,7 @@ static void fill_vaapi_pic(VAPictureH264 *va_pic, { if (pic_structure == 0) pic_structure = pic->reference; + pic_structure &= PICT_FRAME; /* PICT_TOP_FIELD|PICT_BOTTOM_FIELD */ va_pic->picture_id = ff_vaapi_get_surface_id(pic); va_pic->frame_idx = pic->long_ref ? pic->pic_id : pic->frame_num; @@ -95,7 +83,7 @@ typedef struct DPB { } DPB; /** - * Appends picture to the decoded picture buffer, in a VA API form that + * Append picture to the decoded picture buffer, in a VA API form that * merges the second field picture attributes with the first, if * available. The decoded picture buffer's size must be large enough * to receive the new VA API picture object. @@ -130,7 +118,7 @@ static int dpb_add(DPB *dpb, Picture *pic) return 0; } -/** Fills in VA API reference frames array. */ +/** Fill in VA API reference frames array. */ static int fill_vaapi_ReferenceFrames(VAPictureParameterBufferH264 *pic_param, H264Context *h) { @@ -149,7 +137,7 @@ static int fill_vaapi_ReferenceFrames(VAPictureParameterBufferH264 *pic_param, return -1; } - for (i = 0; i < h->long_ref_count; i++) { + for (i = 0; i < 16; i++) { Picture * const pic = h->long_ref[i]; if (pic && pic->reference && dpb_add(&dpb, pic) < 0) return -1; @@ -158,11 +146,11 @@ static int fill_vaapi_ReferenceFrames(VAPictureParameterBufferH264 *pic_param, } /** - * Fills in VA API reference picture lists from the FFmpeg reference + * Fill in VA API reference picture lists from the Libav reference * picture list. * * @param[out] RefPicList VA API internal reference picture list - * @param[in] ref_list A pointer to the FFmpeg reference list + * @param[in] ref_list A pointer to the Libav reference list * @param[in] ref_count The number of reference pictures in ref_list */ static void fill_vaapi_RefPicList(VAPictureH264 RefPicList[32], @@ -179,7 +167,7 @@ static void fill_vaapi_RefPicList(VAPictureH264 RefPicList[32], } /** - * Fills in prediction weight table. + * Fill in prediction weight table. * * VA API requires a plain prediction weight table as it does not infer * any value. @@ -211,16 +199,16 @@ static void fill_vaapi_plain_pred_weight_table(H264Context *h, /* VA API also wants the inferred (default) values, not only what is available in the bitstream (7.4.3.2). */ if (h->luma_weight_flag[list]) { - luma_weight[i] = h->luma_weight[list][i]; - luma_offset[i] = h->luma_offset[list][i]; + luma_weight[i] = h->luma_weight[i][list][0]; + luma_offset[i] = h->luma_weight[i][list][1]; } else { luma_weight[i] = 1 << h->luma_log2_weight_denom; luma_offset[i] = 0; } for (j = 0; j < 2; j++) { if (h->chroma_weight_flag[list]) { - chroma_weight[i][j] = h->chroma_weight[list][i][j]; - chroma_offset[i][j] = h->chroma_offset[list][i][j]; + chroma_weight[i][j] = h->chroma_weight[i][list][j][0]; + chroma_offset[i][j] = h->chroma_weight[i][list][j][1]; } else { chroma_weight[i][j] = 1 << h->chroma_log2_weight_denom; chroma_offset[i][j] = 0; @@ -229,7 +217,7 @@ static void fill_vaapi_plain_pred_weight_table(H264Context *h, } } -/** Initializes and starts decoding a frame with VA API. */ +/** Initialize and start decoding a frame with VA API. */ static int start_frame(AVCodecContext *avctx, av_unused const uint8_t *buffer, av_unused uint32_t size) @@ -240,7 +228,7 @@ static int start_frame(AVCodecContext *avctx, VAPictureParameterBufferH264 *pic_param; VAIQMatrixBufferH264 *iq_matrix; - dprintf(avctx, "start_frame()\n"); + av_dlog(avctx, "start_frame()\n"); vactx->slice_param_size = sizeof(VASliceParameterBufferH264); @@ -270,7 +258,7 @@ static int start_frame(AVCodecContext *avctx, pic_param->seq_fields.bits.delta_pic_order_always_zero_flag = h->sps.delta_pic_order_always_zero_flag; pic_param->num_slice_groups_minus1 = h->pps.slice_group_count - 1; pic_param->slice_group_map_type = h->pps.mb_slice_group_map_type; - pic_param->slice_group_change_rate_minus1 = 0; /* XXX: unimplemented in FFmpeg */ + pic_param->slice_group_change_rate_minus1 = 0; /* XXX: unimplemented in Libav */ pic_param->pic_init_qp_minus26 = h->pps.init_qp - 26; pic_param->pic_init_qs_minus26 = h->pps.init_qs - 26; pic_param->chroma_qp_index_offset = h->pps.chroma_qp_index_offset[0]; @@ -297,16 +285,16 @@ static int start_frame(AVCodecContext *avctx, return 0; } -/** Ends a hardware decoding based frame. */ +/** End a hardware decoding based frame. */ static int end_frame(AVCodecContext *avctx) { H264Context * const h = avctx->priv_data; - dprintf(avctx, "end_frame()\n"); + av_dlog(avctx, "end_frame()\n"); return ff_vaapi_common_end_frame(&h->s); } -/** Decodes the given H.264 slice with VA API. */ +/** Decode the given H.264 slice with VA API. */ static int decode_slice(AVCodecContext *avctx, const uint8_t *buffer, uint32_t size) @@ -315,7 +303,7 @@ static int decode_slice(AVCodecContext *avctx, MpegEncContext * const s = &h->s; VASliceParameterBufferH264 *slice_param; - dprintf(avctx, "decode_slice(): buffer %p, size %d\n", buffer, size); + av_dlog(avctx, "decode_slice(): buffer %p, size %d\n", buffer, size); /* Fill in VASliceParameterBufferH264. */ slice_param = (VASliceParameterBufferH264 *)ff_vaapi_alloc_slice(avctx->hwaccel_context, buffer, size); @@ -323,15 +311,15 @@ static int decode_slice(AVCodecContext *avctx, return -1; slice_param->slice_data_bit_offset = get_bits_count(&h->s.gb) + 8; /* bit buffer started beyond nal_unit_type */ slice_param->first_mb_in_slice = (s->mb_y >> FIELD_OR_MBAFF_PICTURE) * s->mb_width + s->mb_x; - slice_param->slice_type = get_slice_type(h); - slice_param->direct_spatial_mv_pred_flag = h->slice_type == FF_B_TYPE ? h->direct_spatial_mv_pred : 0; + slice_param->slice_type = ff_h264_get_slice_type(h); + slice_param->direct_spatial_mv_pred_flag = h->slice_type == AV_PICTURE_TYPE_B ? h->direct_spatial_mv_pred : 0; slice_param->num_ref_idx_l0_active_minus1 = h->list_count > 0 ? h->ref_count[0] - 1 : 0; slice_param->num_ref_idx_l1_active_minus1 = h->list_count > 1 ? h->ref_count[1] - 1 : 0; slice_param->cabac_init_idc = h->cabac_init_idc; slice_param->slice_qp_delta = s->qscale - h->pps.init_qp; slice_param->disable_deblocking_filter_idc = h->deblocking_filter < 2 ? !h->deblocking_filter : h->deblocking_filter; - slice_param->slice_alpha_c0_offset_div2 = h->slice_alpha_c0_offset / 2; - slice_param->slice_beta_offset_div2 = h->slice_beta_offset / 2; + slice_param->slice_alpha_c0_offset_div2 = h->slice_alpha_c0_offset / 2 - 26; + slice_param->slice_beta_offset_div2 = h->slice_beta_offset / 2 - 26; slice_param->luma_log2_weight_denom = h->luma_log2_weight_denom; slice_param->chroma_log2_weight_denom = h->chroma_log2_weight_denom; @@ -347,9 +335,9 @@ static int decode_slice(AVCodecContext *avctx, return 0; } -AVHWAccel h264_vaapi_hwaccel = { +AVHWAccel ff_h264_vaapi_hwaccel = { .name = "h264_vaapi", - .type = CODEC_TYPE_VIDEO, + .type = AVMEDIA_TYPE_VIDEO, .id = CODEC_ID_H264, .pix_fmt = PIX_FMT_VAAPI_VLD, .capabilities = 0,