From 49774b3c582c7583d64d798c1a81171eba054b50 Mon Sep 17 00:00:00 2001 From: Gwenole Beauchesne Date: Wed, 31 Oct 2012 11:07:48 +0100 Subject: [PATCH] h264: add vaapi_fill_picture() helper. Add vaapi_fill_picture() helper function to convert GstVaapiPictureH264 to VAPictureH264 structure. This is preparatory work to get rid of the local VAPictureH264 member in GstVaapiPictureH264. --- gst-libs/gst/vaapi/gstvaapidecoder_h264.c | 51 ++++++++++++++++++++++++++----- 1 file changed, 44 insertions(+), 7 deletions(-) diff --git a/gst-libs/gst/vaapi/gstvaapidecoder_h264.c b/gst-libs/gst/vaapi/gstvaapidecoder_h264.c index ef07381..c2f9602 100644 --- a/gst-libs/gst/vaapi/gstvaapidecoder_h264.c +++ b/gst-libs/gst/vaapi/gstvaapidecoder_h264.c @@ -2030,6 +2030,43 @@ vaapi_init_picture(VAPictureH264 *pic) pic->BottomFieldOrderCnt = 0; } +static void +vaapi_fill_picture(VAPictureH264 *pic, GstVaapiPictureH264 *picture) +{ + const guint field_flags = (VA_PICTURE_H264_TOP_FIELD | + VA_PICTURE_H264_BOTTOM_FIELD); + + pic->picture_id = picture->base.surface_id; + pic->flags = 0; + + if (picture->info.flags & VA_PICTURE_H264_LONG_TERM_REFERENCE) { + pic->flags |= VA_PICTURE_H264_LONG_TERM_REFERENCE; + pic->frame_idx = picture->info.frame_idx; + } + else { + if (picture->info.flags & VA_PICTURE_H264_SHORT_TERM_REFERENCE) + pic->flags |= VA_PICTURE_H264_SHORT_TERM_REFERENCE; + pic->frame_idx = picture->frame_num; + } + + switch (picture->info.flags & field_flags) { + case 0: + pic->TopFieldOrderCnt = picture->info.TopFieldOrderCnt; + pic->BottomFieldOrderCnt = picture->info.BottomFieldOrderCnt; + break; + case VA_PICTURE_H264_TOP_FIELD: + pic->flags |= VA_PICTURE_H264_TOP_FIELD; + pic->TopFieldOrderCnt = picture->info.BottomFieldOrderCnt; + pic->BottomFieldOrderCnt = 0; + break; + case VA_PICTURE_H264_BOTTOM_FIELD: + pic->flags |= VA_PICTURE_H264_BOTTOM_FIELD; + pic->BottomFieldOrderCnt = picture->info.BottomFieldOrderCnt; + pic->TopFieldOrderCnt = 0; + break; + } +} + static gboolean fill_picture( GstVaapiDecoderH264 *decoder, @@ -2046,11 +2083,11 @@ fill_picture( guint i, n; /* Fill in VAPictureParameterBufferH264 */ - pic_param->CurrPic = picture->info; - for (i = 0, n = 0; i < priv->short_ref_count; i++) - pic_param->ReferenceFrames[n++] = priv->short_ref[i]->info; - for (i = 0; i < priv->long_ref_count; i++) - pic_param->ReferenceFrames[n++] = priv->long_ref[i]->info; + vaapi_fill_picture(&pic_param->CurrPic, picture); + for (i = 0, n = 0; i < priv->short_ref_count; i++, n++) + vaapi_fill_picture(&pic_param->ReferenceFrames[n], priv->short_ref[i]); + for (i = 0; i < priv->long_ref_count; i++, n++) + vaapi_fill_picture(&pic_param->ReferenceFrames[n], priv->long_ref[i]); for (; n < G_N_ELEMENTS(pic_param->ReferenceFrames); n++) vaapi_init_picture(&pic_param->ReferenceFrames[n]); @@ -2330,7 +2367,7 @@ fill_RefPicList(GstVaapiDecoderH264 *decoder, GstVaapiSliceH264 *slice) slice_hdr->num_ref_idx_l0_active_minus1; for (i = 0; i < priv->RefPicList0_count && priv->RefPicList0[i]; i++) - slice_param->RefPicList0[i] = priv->RefPicList0[i]->info; + vaapi_fill_picture(&slice_param->RefPicList0[i], priv->RefPicList0[i]); for (; i <= slice_param->num_ref_idx_l0_active_minus1; i++) vaapi_init_picture(&slice_param->RefPicList0[i]); @@ -2341,7 +2378,7 @@ fill_RefPicList(GstVaapiDecoderH264 *decoder, GstVaapiSliceH264 *slice) slice_hdr->num_ref_idx_l1_active_minus1; for (i = 0; i < priv->RefPicList1_count && priv->RefPicList1[i]; i++) - slice_param->RefPicList1[i] = priv->RefPicList1[i]->info; + vaapi_fill_picture(&slice_param->RefPicList1[i], priv->RefPicList1[i]); for (; i <= slice_param->num_ref_idx_l1_active_minus1; i++) vaapi_init_picture(&slice_param->RefPicList1[i]); return TRUE; -- 2.7.4