2 * gstvaapiencoder_h264.c - H.264 encoder
4 * Copyright (C) 2011 Intel Corporation
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public License
8 * as published by the Free Software Foundation; either version 2.1
9 * of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free
18 * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19 * Boston, MA 02110-1301 USA
21 #define HAVE_OLD_H264_ENCODER 0
23 #include "gstvaapiencoder_h264.h"
29 #include <va/va_x11.h>
30 #if !HAVE_OLD_H264_ENCODER
31 #include <va/va_enc_h264.h>
36 #include "gst/gstclock.h"
37 #include "gst/gstvalue.h"
39 #include "gstvaapiobject.h"
40 #include "gstvaapiobject_priv.h"
41 #include "gstvaapicontext.h"
42 #include "gstvaapisurface.h"
43 #include "gstvaapivideobuffer.h"
44 #include "gstvaapidisplay_priv.h"
46 GST_DEBUG_CATEGORY_STATIC (gst_vaapi_h264_encoder_debug);
48 #define GST_CAT_DEFAULT gst_vaapi_h264_encoder_debug
50 #define GST_VAAPI_ENCODER_H264_CAST(encoder) ((GstVaapiEncoderH264 *)(encoder))
52 #define SHARE_CODED_BUF 0
54 #define DEFAULT_SURFACE_NUMBER 3
55 #define DEFAULT_CODEDBUF_NUM 5
56 #define DEFAULT_SID_INPUT 0 // suface_ids[0]
58 #define REF_RECON_SURFACE_NUM 2
60 #define ENTROPY_MODE_CAVLC 0
61 #define ENTROPY_MODE_CABAC 1
67 #define NAL_REF_IDC_NONE 0
68 #define NAL_REF_IDC_LOW 1
69 #define NAL_REF_IDC_MEDIUM 2
70 #define NAL_REF_IDC_HIGH 3
76 NAL_IDR = 5, /* ref_idc != 0 */
77 NAL_SEI = 6, /* ref_idc == 0 */
91 struct _GstVaapiEncoderH264Private {
92 GstVaapiEncoderH264 *public;
93 guint32 format; /*NV12, I420,*/
94 gboolean avc_flag; /*elementary flag*/
97 GQueue *video_buffer_caches; /*not used for baseline*/
99 GstVaapiSurface *ref_surface1; /* reference buffer*/
100 GstVaapiSurface *ref_surface2; /* for B frames */
101 GstVaapiSurface *recon_surface; /* reconstruct buffer*/
103 VABufferID seq_param_id;
104 VABufferID pic_param_id;
105 VABufferID slice_param_id;
106 VABufferID packed_seq_param_id;
107 VABufferID packed_seq_data_id;
108 VABufferID packed_pic_param_id;
109 VABufferID packed_pic_data_id;
110 #if HAVE_OLD_H264_ENCODER
111 VAEncSliceParameterBuffer *slice_param_buffers;
113 VAEncSliceParameterBufferH264 *slice_param_buffers;
115 guint32 default_slice_height;
116 guint32 slice_mod_mb_num;
117 guint32 default_cts_offset;
122 GQueue *queued_buffers; /* GstVaapiVideoBuffers with surface*/
125 guint32 cur_display_num;
126 guint32 cur_decode_num;
127 H264_SLICE_TYPE cur_slice_type;
128 guint64 last_decode_time;
129 guint32 max_frame_num;
130 guint32 max_pic_order_cnt;
134 G_DEFINE_TYPE(GstVaapiEncoderH264, gst_vaapi_encoder_h264, GST_TYPE_VAAPI_BASE_ENCODER)
137 #define H264_BITSTREAM_ALLOC_ALIGN_MASK 0x0FFF
139 #define BIT_STREAM_BUFFER(stream) ((stream)->buffer)
140 #define BIT_STREAM_BIT_SIZE(stream) ((stream)->bit_size)
142 struct _H264Bitstream {
145 guint32 max_bit_capability;
148 typedef struct _H264Bitstream H264Bitstream;
150 static const guint8 h264_bit_mask[9] = {0x00, 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F, 0xFF};
152 /* h264 bitstream functions */
154 h264_bitstream_init(H264Bitstream *bitstream, guint32 bit_capability);
157 h264_bitstream_write_uint(
158 H264Bitstream *bitstream,
164 h264_bitstream_align(H264Bitstream *bitstream, guint32 value);
167 h264_bitstream_write_ue(H264Bitstream *bitstream, guint32 value);
170 h264_bitstream_write_se(H264Bitstream *bitstream, gint32 value);
173 h264_bitstream_write_trailing_bits(H264Bitstream *bitstream);
176 h264_bitstream_write_byte_array(
177 H264Bitstream *bitstream,
183 h264_bitstream_destroy(H264Bitstream *bitstream, gboolean free_flag);
186 h264_bitstream_auto_grow(H264Bitstream *bitstream, guint32 extra_bit_size);
189 h264_bitstream_write_sps(
190 H264Bitstream *bitstream,
191 VAEncSequenceParameterBufferH264 *seq,
195 h264_bitstream_write_pps(
196 H264Bitstream *bitstream,
197 VAEncPictureParameterBufferH264 *pic
201 h264_bitstream_write_nal_header(
202 H264Bitstream *bitstream,
208 h264_get_va_profile(guint32 profile)
211 case H264_PROFILE_BASELINE:
212 return VAProfileH264Baseline;
214 case H264_PROFILE_MAIN:
215 return VAProfileH264Main;
217 case H264_PROFILE_HIGH:
218 return VAProfileH264High;
226 GstVaapiEncoderH264 *
227 gst_vaapi_encoder_h264_new(void)
229 return GST_VAAPI_ENCODER_H264_CAST(
230 g_object_new(GST_TYPE_VAAPI_ENCODER_H264, NULL));
234 gst_vaapi_encoder_h264_init_public_values(GstVaapiEncoderH264* encoder)
236 encoder->profile = 0;
238 encoder->bitrate = 0;
239 encoder->intra_period = 0;
240 encoder->init_qp = -1;
241 encoder->min_qp = -1;
242 encoder->slice_num = 0;
243 encoder->b_frame_num = 0;
247 gst_vaapi_encoder_h264_set_avc_flag(GstVaapiEncoderH264* encoder, gboolean avc)
249 GstVaapiEncoderH264Private *priv = encoder->priv;
250 priv->avc_flag = avc;
254 gst_vaapi_encoder_h264_get_avc_flag(GstVaapiEncoderH264* encoder)
256 GstVaapiEncoderH264Private *priv = encoder->priv;
257 return priv->avc_flag;
261 gst_vaapi_encoder_h264_validate_attributes(GstVaapiBaseEncoder *base)
263 GstVaapiEncoderH264 *encoder = GST_VAAPI_ENCODER_H264_CAST(base);
264 GstVaapiEncoderH264Private *priv = encoder->priv;
265 if (!ENCODER_WIDTH(encoder) ||
266 !ENCODER_HEIGHT(encoder) ||
267 !ENCODER_FPS(encoder)) {
270 if (!encoder->profile) {
271 encoder->profile = H264_DEFAULT_PROFILE;
273 gst_vaapi_base_encoder_set_va_profile(base, h264_get_va_profile(encoder->profile));
274 if (!encoder->level) {
275 if (encoder->profile <= H264_PROFILE_BASELINE)
276 encoder->level = H264_LEVEL_30;
278 encoder->level = H264_LEVEL_41;
280 if (!encoder->intra_period) {
281 encoder->intra_period = H264_DEFAULT_INTRA_PERIOD;
283 if (-1 == encoder->init_qp) {
284 encoder->init_qp = H264_DEFAULT_INIT_QP;
286 if (-1 == encoder->min_qp) {
287 encoder->min_qp = H264_DEFAULT_MIN_QP;
290 if (encoder->min_qp > encoder->init_qp) {
291 encoder->min_qp = encoder->init_qp;
294 /* default compress ratio 1: (4*8*1.5) */
295 if (!encoder->bitrate) {
296 encoder->bitrate = 0; //ENCODER_WIDTH(encoder)*ENCODER_HEIGHT(encoder)*ENCODER_FPS(encoder)/4;
299 if (!encoder->slice_num) {
300 encoder->slice_num = H264_DEFAULT_SLICE_NUM;
303 /* need calculate slice-num and each slice-height
304 suppose: ((encoder->height+15)/16) = 13, slice_num = 8
305 then: slice_1_height = 2
314 priv->default_slice_height = (ENCODER_HEIGHT(encoder)+15)/16/encoder->slice_num;
315 if (0 == priv->default_slice_height) { /* special value */
316 priv->default_slice_height = 1;
317 priv->slice_mod_mb_num = 0;
318 encoder->slice_num = (ENCODER_HEIGHT(encoder)+15)/16;
320 priv->slice_mod_mb_num = ((ENCODER_HEIGHT(encoder)+15)/16)%encoder->slice_num;
323 if (encoder->b_frame_num) {
324 priv->default_cts_offset = GST_SECOND/ENCODER_FPS(encoder);
326 priv->default_cts_offset = 0;
333 h264_encoder_release_parameters(GstVaapiEncoderH264 *encoder)
335 VAStatus va_status = VA_STATUS_SUCCESS;
336 GstVaapiEncoderH264Private *priv = encoder->priv;
337 GstVaapiDisplay *display = ENCODER_DISPLAY(encoder);
338 GstVaapiContext *context = ENCODER_CONTEXT(encoder);
340 gboolean is_locked = FALSE;
342 ENCODER_ASSERT(display);
343 ENCODER_ASSERT(context);
344 VAAPI_UNUSED_ARG(va_status);
345 VADisplay va_dpy = gst_vaapi_display_get_display(display);
347 ENCODER_ACQUIRE_DISPLAY_LOCK(display);
348 if (VA_INVALID_ID != priv->seq_param_id) {
349 va_status = vaDestroyBuffer(va_dpy, priv->seq_param_id);
350 priv->seq_param_id = VA_INVALID_ID;
352 if (VA_INVALID_ID != priv->pic_param_id) {
353 va_status = vaDestroyBuffer(va_dpy, priv->pic_param_id);
354 priv->pic_param_id = VA_INVALID_ID;
356 if (VA_INVALID_ID != priv->slice_param_id) {
357 va_status = vaDestroyBuffer(va_dpy, priv->slice_param_id);
358 priv->slice_param_id = VA_INVALID_ID;
361 if (VA_INVALID_ID != priv->packed_seq_param_id) {
362 va_status = vaDestroyBuffer(va_dpy, priv->packed_seq_param_id);
363 priv->packed_seq_param_id = VA_INVALID_ID;
365 if (VA_INVALID_ID != priv->packed_seq_data_id) {
366 va_status = vaDestroyBuffer(va_dpy, priv->packed_seq_data_id);
367 priv->packed_seq_data_id = VA_INVALID_ID;
369 if (VA_INVALID_ID != priv->packed_pic_param_id) {
370 va_status = vaDestroyBuffer(va_dpy, priv->packed_pic_param_id);
371 priv->packed_pic_param_id = VA_INVALID_ID;
373 if (VA_INVALID_ID != priv->packed_pic_data_id) {
374 va_status = vaDestroyBuffer(va_dpy, priv->packed_pic_data_id);
375 priv->packed_pic_data_id = VA_INVALID_ID;
378 ENCODER_RELEASE_DISPLAY_LOCK(display);
380 if (priv->slice_param_buffers) {
381 g_free(priv->slice_param_buffers);
382 priv->slice_param_buffers = NULL;
385 if (priv->sps_data) {
386 gst_buffer_unref(priv->sps_data);
387 priv->sps_data = NULL;
389 if (priv->pps_data) {
390 gst_buffer_unref(priv->pps_data);
391 priv->pps_data = NULL;
398 h264_release_queued_buffers(GstVaapiEncoderH264Private *priv)
400 while (!g_queue_is_empty(priv->queued_buffers)) {
401 GstBuffer* tmp = g_queue_pop_head(priv->queued_buffers);
403 gst_buffer_unref(tmp);
409 gst_vaapi_encoder_h264_release_resource(
410 GstVaapiBaseEncoder* base
413 GstVaapiEncoderH264* encoder = GST_VAAPI_ENCODER_H264_CAST(base);
415 GstVaapiEncoderH264Private *priv = encoder->priv;
416 GstVaapiContext *context = ENCODER_CONTEXT(base);
418 /* release buffers first */
419 h264_encoder_release_parameters(encoder);
420 h264_release_queued_buffers(priv);
421 priv->cur_display_num = 0;
422 priv->cur_decode_num = 0;
423 priv->cur_slice_type = SLICE_TYPE_I;
425 priv->last_decode_time = 0LL;
426 priv->default_cts_offset = 0;
428 /*remove ref_surface1*/
429 if (priv->ref_surface1) {
431 gst_vaapi_context_put_surface(context, priv->ref_surface1);
433 g_object_unref(priv->ref_surface1);
435 priv->ref_surface1 = NULL;
438 if (priv->ref_surface2) {
440 gst_vaapi_context_put_surface(context, priv->ref_surface2);
442 g_object_unref(priv->ref_surface2);
444 priv->ref_surface2 = NULL;
447 /*remove recon_surface*/
448 if (priv->recon_surface) {
450 gst_vaapi_context_put_surface(context, priv->recon_surface);
452 g_object_unref(priv->recon_surface);
454 priv->recon_surface = NULL;
461 gst_vaapi_encoder_h264_alloc_slices(
462 GstVaapiBaseEncoder *base,
463 GstVaapiContext *context
467 GstVaapiEncoderH264 *encoder = GST_VAAPI_ENCODER_H264_CAST(base);
468 GstVaapiEncoderH264Private *priv = encoder->priv;
470 priv->slice_param_buffers =
471 #if HAVE_OLD_H264_ENCODER
472 (VAEncSliceParameterBuffer*)
474 (VAEncSliceParameterBufferH264*)
476 g_malloc0_n(encoder->slice_num,
477 sizeof(priv->slice_param_buffers[0]));
483 gst_vaapi_encoder_h264_frame_failed(
484 GstVaapiBaseEncoder *base,
485 GstVaapiVideoBuffer* buffer
488 GstVaapiEncoderH264 *encoder = GST_VAAPI_ENCODER_H264_CAST(base);
489 GstVaapiEncoderH264Private *priv = encoder->priv;
491 h264_release_queued_buffers(priv);
492 priv->cur_display_num = 0;
493 priv->cur_decode_num = 0;
494 priv->cur_slice_type = SLICE_TYPE_I;
496 priv->last_decode_time = 0LL;
500 gst_vaapi_encoder_h264_prepare_next_buffer(
501 GstVaapiBaseEncoder* base,
502 GstVaapiVideoBuffer *display_buf,
504 GstVaapiVideoBuffer **out_buf
507 EncoderStatus ret = ENCODER_NO_ERROR;
508 GstVaapiEncoderH264 *encoder = GST_VAAPI_ENCODER_H264_CAST(base);
509 GstVaapiEncoderH264Private *priv = encoder->priv;
510 GstVaapiVideoBuffer *return_buf = NULL;
513 if (NULL == display_buf && g_queue_is_empty(priv->queued_buffers)) {
514 ret = ENCODER_BUFFER_EMPTY;
515 if (priv->gop_count >= encoder->intra_period || need_flush)
522 gst_buffer_ref(GST_BUFFER_CAST(display_buf));
523 priv->last_decode_time = GST_BUFFER_TIMESTAMP(display_buf);
527 if (priv->gop_count == 1) {
528 ENCODER_ASSERT(display_buf);
529 priv->cur_display_num = 0;
530 priv->cur_decode_num = 0;
531 priv->cur_slice_type = SLICE_TYPE_I;
533 return_buf = display_buf;
538 if (encoder->b_frame_num &&
539 priv->gop_count < encoder->intra_period &&
540 g_queue_get_length(priv->queued_buffers) < encoder->b_frame_num
543 g_queue_push_tail(priv->queued_buffers, display_buf);
544 ret = ENCODER_BUFFER_WAITING;
547 priv->cur_slice_type = SLICE_TYPE_P;
548 priv->cur_display_num = priv->gop_count-1;
549 ++priv->cur_decode_num;
550 return_buf = display_buf;
553 return_buf = (GstVaapiVideoBuffer*)g_queue_pop_tail(priv->queued_buffers);
554 priv->cur_slice_type = SLICE_TYPE_P;
555 priv->cur_display_num = priv->gop_count - 1;
556 ++priv->cur_decode_num;
558 return_buf = (GstVaapiVideoBuffer*)g_queue_pop_head(priv->queued_buffers);
559 priv->cur_slice_type = SLICE_TYPE_B;
560 priv->cur_display_num =
561 priv->gop_count - 2 - g_queue_get_length(priv->queued_buffers);
566 *out_buf = return_buf;
572 h264_swap_surface(GstVaapiSurface **s1, GstVaapiSurface **s2)
574 GstVaapiSurface *tmp;
576 g_return_if_fail(s1 && s2);
582 static inline const char *
583 get_slice_type(H264_SLICE_TYPE type)
597 #if HAVE_OLD_H264_ENCODER
600 set_sequence_parameters(
601 GstVaapiEncoderH264 *encoder,
602 VAEncSequenceParameterBufferH264 *seq_param
605 seq_param->seq_parameter_set_id = 0;
606 seq_param->level_idc = encoder->level; /* 3.0 */
607 seq_param->intra_period = encoder->intra_period;
608 seq_param->intra_idr_period = encoder->intra_period;
609 seq_param->max_num_ref_frames = 1; /*Only I, P frames*/
610 seq_param->picture_width_in_mbs = (ENCODER_WIDTH(encoder)+15)/16;
611 seq_param->picture_height_in_mbs = (ENCODER_HEIGHT(encoder)+15)/16;
613 seq_param->bits_per_second = encoder->bitrate;
614 seq_param->frame_rate = ENCODER_FPS(encoder);
615 seq_param->initial_qp = encoder->init_qp; /*qp_value; 15, 24, 26?*/
616 seq_param->min_qp = encoder->min_qp; /*1, 6, 10*/
617 seq_param->basic_unit_size = 0;
618 seq_param->vui_flag = FALSE;
624 set_picture_parameters(
625 GstVaapiEncoderH264 *encoder,
626 VAEncPictureParameterBufferH264 *pic_param,
630 GstVaapiEncoderH264Private *priv = encoder->priv;
632 pic_param->reference_picture = GST_VAAPI_OBJECT_ID(priv->ref_surface1);
633 pic_param->reconstructed_picture = GST_VAAPI_OBJECT_ID(priv->recon_surface);
634 pic_param->coded_buf = coded_buf;
635 pic_param->picture_width = ENCODER_WIDTH(encoder);
636 pic_param->picture_height = ENCODER_HEIGHT(encoder);
637 pic_param->last_picture = 0; // last pic or not
643 set_slices_parameters(
644 GstVaapiEncoderH264 *encoder,
645 VAEncSliceParameterBuffer *slices,
649 GstVaapiEncoderH264Private *priv = encoder->priv;
650 VAEncSliceParameterBuffer *slice_param;
653 guint32 last_row_num = 0;
654 guint32 slice_mod_num = priv->slice_mod_mb_num;
656 for (i = 0; i < slice_num; ++i) {
657 slice_param = &slices[i];
658 slice_param->start_row_number = last_row_num; /* unit MB*/
659 slice_param->slice_height = priv->default_slice_height; /* unit MB */
661 ++slice_param->slice_height;
664 last_row_num += slice_param->slice_height;
665 slice_param->slice_flags.bits.is_intra =
666 (priv->cur_slice_type == SLICE_TYPE_I);
667 slice_param->slice_flags.bits.disable_deblocking_filter_idc = FALSE;
668 slice_param->slice_flags.bits.uses_long_term_ref = FALSE;
669 slice_param->slice_flags.bits.is_long_term_ref = FALSE;
672 ENCODER_ASSERT(last_row_num == (ENCODER_HEIGHT(encoder)+15)/16);
676 #else /* extended libva, new parameter structures*/
679 set_sequence_parameters(
680 GstVaapiEncoderH264 *encoder,
681 VAEncSequenceParameterBufferH264 *seq_param
684 GstVaapiEncoderH264Private *priv = encoder->priv;
685 guint width_in_mbs, height_in_mbs;
687 width_in_mbs = (ENCODER_WIDTH(encoder)+15)/16;
688 height_in_mbs = (ENCODER_HEIGHT(encoder)+15)/16;
690 seq_param->seq_parameter_set_id = 0;
691 seq_param->level_idc = encoder->level; /* 3.0 */
692 seq_param->intra_period = encoder->intra_period;
693 seq_param->ip_period = 0; // ?
694 if (encoder->bitrate> 0)
695 seq_param->bits_per_second = encoder->bitrate; /* use kbps as input */
697 seq_param->bits_per_second = 0;
699 seq_param->max_num_ref_frames =
700 (encoder->b_frame_num < 2 ? 3 : encoder->b_frame_num+1); // ?, why 4
701 seq_param->picture_width_in_mbs = width_in_mbs;
702 seq_param->picture_height_in_mbs = height_in_mbs;
704 /*sequence field values*/
705 seq_param->seq_fields.value = 0;
706 seq_param->seq_fields.bits.chroma_format_idc = 1;
707 seq_param->seq_fields.bits.frame_mbs_only_flag = 1;
708 seq_param->seq_fields.bits.mb_adaptive_frame_field_flag = FALSE;
709 seq_param->seq_fields.bits.seq_scaling_matrix_present_flag = FALSE;
710 /* direct_8x8_inference_flag default false */
711 seq_param->seq_fields.bits.direct_8x8_inference_flag = FALSE;
712 seq_param->seq_fields.bits.log2_max_frame_num_minus4 = 4; // log2(seq.intra_period)-3 : 0
713 /* picture order count */
714 seq_param->seq_fields.bits.pic_order_cnt_type = 0;
715 seq_param->seq_fields.bits.log2_max_pic_order_cnt_lsb_minus4 =
716 seq_param->seq_fields.bits.log2_max_frame_num_minus4 + 2;
717 seq_param->seq_fields.bits.delta_pic_order_always_zero_flag = TRUE;
719 priv->max_frame_num =
720 1<<(seq_param->seq_fields.bits.log2_max_frame_num_minus4 + 4);
721 priv->max_pic_order_cnt =
722 1 <<(seq_param->seq_fields.bits.log2_max_pic_order_cnt_lsb_minus4 + 4);
724 seq_param->bit_depth_luma_minus8 = 0;
725 seq_param->bit_depth_chroma_minus8 = 0;
727 /* not used if pic_order_cnt_type == 0 */
728 seq_param->num_ref_frames_in_pic_order_cnt_cycle = 0;
729 seq_param->offset_for_non_ref_pic = 0;
730 seq_param->offset_for_top_to_bottom_field = 0;
731 memset(seq_param->offset_for_ref_frame,
733 sizeof(seq_param->offset_for_ref_frame));
735 if (height_in_mbs*16 - ENCODER_HEIGHT(encoder)) {
736 seq_param->frame_cropping_flag = 1;
737 seq_param->frame_crop_left_offset = 0;
738 seq_param->frame_crop_right_offset = 0;
739 seq_param->frame_crop_top_offset = 0;
740 seq_param->frame_crop_bottom_offset =
741 ((height_in_mbs * 16 - ENCODER_HEIGHT(encoder))/
742 (2 * (!seq_param->seq_fields.bits.frame_mbs_only_flag + 1)));
745 if (h264_encoder->init_qp == -1)
746 seq.rate_control_method = BR_CBR;
747 else if (h264_encoder->init_qp == -2)
748 seq.rate_control_method = BR_VBR;
750 ENCODER_ASSERT(h264_encoder->init_qp >= 0 && h264_encoder->init_qp <= 51);
751 seq.rate_control_method = BR_CQP;
756 seq_param->vui_parameters_present_flag = FALSE;
761 ensure_packed_sps_data(
762 GstVaapiEncoderH264 *encoder,
763 VAEncSequenceParameterBufferH264 *seq_param
766 GstVaapiEncoderH264Private *priv = encoder->priv;
767 VAEncPackedHeaderParameterBuffer packed_header_param_buffer = { 0 };
768 VADisplay va_dpy = ENCODER_VA_DISPLAY(encoder);
769 VAContextID context_id = ENCODER_VA_CONTEXT(encoder);
770 guint32 length_in_bits;
771 guint8 *packed_seq_buffer = NULL;
772 H264Bitstream bitstream;
774 VAStatus va_status = VA_STATUS_SUCCESS;
779 h264_bitstream_init(&bitstream, 128*8);
780 h264_bitstream_write_uint(&bitstream, 0x00000001, 32); /* start code*/
781 h264_bitstream_write_nal_header(&bitstream, NAL_REF_IDC_HIGH, NAL_SPS);
782 h264_bitstream_write_sps(&bitstream, seq_param, encoder->profile);
783 ENCODER_ASSERT(BIT_STREAM_BIT_SIZE(&bitstream)%8 == 0);
784 length_in_bits = BIT_STREAM_BIT_SIZE(&bitstream);
785 packed_seq_buffer = BIT_STREAM_BUFFER(&bitstream);
787 /* set codec data sps */
788 priv->sps_data = gst_buffer_new_and_alloc((length_in_bits+7)/8);
789 GST_BUFFER_SIZE(priv->sps_data) = (length_in_bits+7)/8-4; /* start code size == 4*/
790 memcpy(GST_BUFFER_DATA(priv->sps_data),
792 GST_BUFFER_SIZE(priv->sps_data));
794 packed_header_param_buffer.type = VAEncPackedHeaderSequence;
795 packed_header_param_buffer.bit_length = length_in_bits;
796 packed_header_param_buffer.has_emulation_bytes = 0;
797 va_status = vaCreateBuffer(va_dpy,
799 VAEncPackedHeaderParameterBufferType,
800 sizeof(packed_header_param_buffer), 1,
801 &packed_header_param_buffer,
802 &priv->packed_seq_param_id);
803 ENCODER_CHECK_STATUS(VA_STATUS_SUCCESS == va_status,
805 "EncPackedSeqHeaderParameterBuffer failed");
806 va_status = vaCreateBuffer(va_dpy,
808 VAEncPackedHeaderDataBufferType,
809 (length_in_bits + 7) / 8, 1,
811 &priv->packed_seq_data_id);
812 h264_bitstream_destroy(&bitstream, TRUE);
813 ENCODER_CHECK_STATUS(VA_STATUS_SUCCESS == va_status,
815 "EncPackedSeqHeaderDataBuffer failed");
822 set_picture_parameters(
823 GstVaapiEncoderH264 *encoder,
824 VAEncPictureParameterBufferH264 *pic_param,
828 GstVaapiEncoderH264Private *priv = encoder->priv;
830 pic_param->pic_parameter_set_id = 0;
831 pic_param->seq_parameter_set_id = 0;
832 pic_param->last_picture = 0; /* means last encoding picture */
833 pic_param->frame_num = (priv->cur_slice_type == SLICE_TYPE_B ?
834 (priv->cur_decode_num + 1) : priv->cur_decode_num);
835 //pic_param.coding_type = 0;
836 pic_param->pic_init_qp = (encoder->init_qp >= 0 ? encoder->init_qp : 26);
837 pic_param->num_ref_idx_l0_active_minus1 = 0; /* only 1 reference */
838 pic_param->num_ref_idx_l1_active_minus1 = 0; /* B frames only have 1 backward and 1 forward reference*/
839 pic_param->chroma_qp_index_offset = 0;
840 pic_param->second_chroma_qp_index_offset = 0;
842 /* set picture fields */
843 pic_param->pic_fields.value = 0;
844 pic_param->pic_fields.bits.idr_pic_flag = (priv->cur_slice_type == SLICE_TYPE_I);
845 pic_param->pic_fields.bits.reference_pic_flag = (priv->cur_slice_type != SLICE_TYPE_B);
846 pic_param->pic_fields.bits.entropy_coding_mode_flag = ENTROPY_MODE_CABAC;
847 pic_param->pic_fields.bits.weighted_pred_flag = FALSE;
848 pic_param->pic_fields.bits.weighted_bipred_idc = 0;
849 pic_param->pic_fields.bits.constrained_intra_pred_flag = 0;
850 pic_param->pic_fields.bits.transform_8x8_mode_flag = TRUE; /* enable 8x8 */
851 pic_param->pic_fields.bits.deblocking_filter_control_present_flag = TRUE; /* enable debloking */
852 pic_param->pic_fields.bits.redundant_pic_cnt_present_flag = FALSE;
853 /* bottom_field_pic_order_in_frame_present_flag */
854 pic_param->pic_fields.bits.pic_order_present_flag = FALSE;
855 pic_param->pic_fields.bits.pic_scaling_matrix_present_flag = FALSE;
857 /* reference list, */
858 pic_param->CurrPic.picture_id = GST_VAAPI_OBJECT_ID(priv->recon_surface);
859 pic_param->CurrPic.TopFieldOrderCnt = priv->cur_display_num * 2; // ??? /**/
860 pic_param->ReferenceFrames[0].picture_id = GST_VAAPI_OBJECT_ID(priv->ref_surface1);
861 pic_param->ReferenceFrames[1].picture_id = GST_VAAPI_OBJECT_ID(priv->ref_surface2);
862 pic_param->ReferenceFrames[2].picture_id = VA_INVALID_ID;
863 pic_param->coded_buf = coded_buf;
865 ENCODER_LOG_INFO("type:%s, frame_num:%d, display_num:%d",
866 get_slice_type(priv->cur_slice_type),
867 pic_param->frame_num,
868 pic_param->CurrPic.TopFieldOrderCnt);
873 ensure_packed_pps_data(
874 GstVaapiEncoderH264 *encoder,
875 VAEncPictureParameterBufferH264 *pic_param
878 GstVaapiEncoderH264Private *priv = encoder->priv;
879 VAEncPackedHeaderParameterBuffer packed_header_param_buffer = { 0 };
880 H264Bitstream bitstream;
881 VADisplay va_dpy = ENCODER_VA_DISPLAY(encoder);
882 VAContextID context_id = ENCODER_VA_CONTEXT(encoder);
883 guint32 length_in_bits;
884 guint8 *packed_pic_buffer = NULL;
886 VAStatus va_status = VA_STATUS_SUCCESS;
888 if (VA_INVALID_ID != priv->packed_pic_data_id)
891 h264_bitstream_init(&bitstream, 128*8);
892 h264_bitstream_write_uint(&bitstream, 0x00000001, 32); /* start code*/
893 h264_bitstream_write_nal_header(&bitstream, NAL_REF_IDC_HIGH, NAL_PPS);
894 h264_bitstream_write_pps(&bitstream, pic_param);
895 ENCODER_ASSERT(BIT_STREAM_BIT_SIZE(&bitstream)%8 == 0);
896 length_in_bits = BIT_STREAM_BIT_SIZE(&bitstream);
897 packed_pic_buffer = BIT_STREAM_BUFFER(&bitstream);
899 /*set codec data pps*/
900 priv->pps_data = gst_buffer_new_and_alloc((length_in_bits+7)/8);
901 GST_BUFFER_SIZE(priv->pps_data) = (length_in_bits+7)/8-4;
902 memcpy(GST_BUFFER_DATA(priv->pps_data),
904 GST_BUFFER_SIZE(priv->pps_data));
906 packed_header_param_buffer.type = VAEncPackedHeaderPicture;
907 packed_header_param_buffer.bit_length = length_in_bits;
908 packed_header_param_buffer.has_emulation_bytes = 0;
910 va_status = vaCreateBuffer(va_dpy,
912 VAEncPackedHeaderParameterBufferType,
913 sizeof(packed_header_param_buffer), 1,
914 &packed_header_param_buffer,
915 &priv->packed_pic_param_id);
916 ENCODER_CHECK_STATUS(VA_STATUS_SUCCESS == va_status,
918 "EncPackedPicHeaderParameterBuffer failed");
920 va_status = vaCreateBuffer(va_dpy,
922 VAEncPackedHeaderDataBufferType,
923 (length_in_bits + 7) / 8, 1,
925 &priv->packed_pic_data_id);
926 h264_bitstream_destroy(&bitstream, TRUE);
927 ENCODER_CHECK_STATUS(VA_STATUS_SUCCESS == va_status,
929 "EncPackedPicHeaderDataBuffer failed");
935 set_slices_parameters(
936 GstVaapiEncoderH264 *encoder,
937 VAEncSliceParameterBufferH264 *slices,
941 GstVaapiEncoderH264Private *priv = encoder->priv;
942 VAEncSliceParameterBufferH264 *slice_param;
944 guint width_in_mbs = (ENCODER_WIDTH(encoder)+15)/16;
946 guint32 last_row_num = 0;
947 guint32 slice_mod_num = priv->slice_mod_mb_num;
949 for (i = 0; i < slice_num; ++i) {
951 slice_param = slices + i;
953 slice_param->macroblock_address = last_row_num*width_in_mbs;
954 slice_param->num_macroblocks = width_in_mbs*priv->default_slice_height;
955 last_row_num += priv->default_slice_height;
957 slice_param->num_macroblocks += width_in_mbs;
961 slice_param->macroblock_info = VA_INVALID_ID;
962 slice_param->slice_type = priv->cur_slice_type;
963 slice_param->pic_parameter_set_id = 0;
964 slice_param->idr_pic_id = priv->idr_num;
965 slice_param->pic_order_cnt_lsb =
966 (priv->cur_display_num*2) % priv->max_pic_order_cnt;
968 /* not used if pic_order_cnt_type = 0 */
969 slice_param->delta_pic_order_cnt_bottom = 0;
970 memset(slice_param->delta_pic_order_cnt,
972 sizeof(slice_param->delta_pic_order_cnt));
974 /*only works for B frames*/
975 slice_param->direct_spatial_mv_pred_flag = FALSE;
976 /* default equal to picture parameters */
977 slice_param->num_ref_idx_active_override_flag = FALSE;
978 slice_param->num_ref_idx_l0_active_minus1 = 0;
979 slice_param->num_ref_idx_l1_active_minus1 = 0;
981 slice_param->RefPicList0[0].picture_id =
982 GST_VAAPI_OBJECT_ID(priv->ref_surface1);
984 i_pic < sizeof(slice_param->RefPicList0)/sizeof(slice_param->RefPicList0[0]);
986 slice_param->RefPicList0[i_pic].picture_id = VA_INVALID_ID;
989 if (SLICE_TYPE_B == priv->cur_slice_type) {
990 slice_param->RefPicList1[0].picture_id =
991 GST_VAAPI_OBJECT_ID(priv->ref_surface2);
996 i_pic < sizeof(slice_param->RefPicList1)/sizeof(slice_param->RefPicList1[0]);
998 slice_param->RefPicList1[i_pic].picture_id = VA_INVALID_ID;
1000 /* not used if pic_param.pic_fields.bits.weighted_pred_flag == FALSE */
1001 slice_param->luma_log2_weight_denom = 0;
1002 slice_param->chroma_log2_weight_denom = 0;
1003 slice_param->luma_weight_l0_flag = FALSE;
1004 memset(slice_param->luma_weight_l0, 0, sizeof(slice_param->luma_weight_l0));
1005 memset(slice_param->luma_offset_l0, 0, sizeof(slice_param->luma_offset_l0));
1006 slice_param->chroma_weight_l0_flag = FALSE;
1007 memset(slice_param->chroma_weight_l0, 0, sizeof(slice_param->chroma_weight_l0));
1008 memset(slice_param->chroma_offset_l0, 0, sizeof(slice_param->chroma_offset_l0));
1009 slice_param->luma_weight_l1_flag = FALSE;
1010 memset(slice_param->luma_weight_l1, 0, sizeof(slice_param->luma_weight_l1));
1011 memset(slice_param->luma_offset_l1, 0, sizeof(slice_param->luma_offset_l1));
1012 slice_param->chroma_weight_l1_flag = FALSE;
1013 memset(slice_param->chroma_weight_l1, 0, sizeof(slice_param->chroma_weight_l1));
1014 memset(slice_param->chroma_offset_l1, 0, sizeof(slice_param->chroma_offset_l1));
1016 slice_param->cabac_init_idc = 0;
1017 slice_param->slice_qp_delta = 0;
1018 slice_param->disable_deblocking_filter_idc = 0;
1019 slice_param->slice_alpha_c0_offset_div2 = 2;
1020 slice_param->slice_beta_offset_div2 = 2;
1023 ENCODER_ASSERT(last_row_num == (ENCODER_HEIGHT(encoder)+15)/16);
1030 h264_fill_sequence_buffer(GstVaapiEncoderH264 *encoder)
1032 GstVaapiEncoderH264Private *priv = encoder->priv;
1033 VAEncSequenceParameterBufferH264 seq_param = { 0 };
1034 VADisplay va_dpy = ENCODER_VA_DISPLAY(encoder);
1035 VAContextID context_id = ENCODER_VA_CONTEXT(encoder);
1036 gboolean ret = TRUE;
1037 VAStatus va_status = VA_STATUS_SUCCESS;
1040 if (VA_INVALID_ID != priv->seq_param_id)
1043 set_sequence_parameters(encoder, &seq_param);
1044 va_status = vaCreateBuffer(va_dpy, context_id,
1045 VAEncSequenceParameterBufferType,
1046 sizeof(seq_param), 1,
1047 &seq_param, &priv->seq_param_id);
1048 ENCODER_CHECK_STATUS(VA_STATUS_SUCCESS == va_status,
1050 "alloc seq-buffer failed.");
1052 #if !HAVE_OLD_H264_ENCODER
1053 ensure_packed_sps_data(encoder, &seq_param);
1061 h264_fill_picture_buffer(
1062 GstVaapiEncoderH264 *encoder,
1063 VABufferID coded_buf
1066 GstVaapiEncoderH264Private *priv = encoder->priv;
1067 VAEncPictureParameterBufferH264 pic_param;
1068 VADisplay va_dpy = ENCODER_VA_DISPLAY(encoder);
1069 VAContextID context_id = ENCODER_VA_CONTEXT(encoder);
1070 gboolean ret = TRUE;
1071 VAStatus va_status = VA_STATUS_SUCCESS;
1073 VAAPI_UNUSED_ARG(va_status);
1074 memset(&pic_param, 0, sizeof(pic_param));
1075 set_picture_parameters(encoder, &pic_param, coded_buf);
1077 if (VA_INVALID_ID != priv->pic_param_id) { /* share the same pic_param_id*/
1078 vaDestroyBuffer(va_dpy, priv->pic_param_id);
1079 priv->pic_param_id = VA_INVALID_ID;
1081 va_status = vaCreateBuffer(va_dpy,
1083 VAEncPictureParameterBufferType,
1084 sizeof(pic_param), 1,
1086 &priv->pic_param_id);
1088 ENCODER_CHECK_STATUS(VA_STATUS_SUCCESS == va_status,
1090 "creating pic-param buffer failed.");
1091 #if !HAVE_OLD_H264_ENCODER
1092 ensure_packed_pps_data(encoder, &pic_param);
1100 h264_fill_slice_buffers(
1101 GstVaapiEncoderH264 *encoder
1104 GstVaapiEncoderH264Private *priv = encoder->priv;
1105 VADisplay va_dpy = ENCODER_VA_DISPLAY(encoder);
1106 VAContextID context_id = ENCODER_VA_CONTEXT(encoder);
1107 gboolean ret = TRUE;
1108 VAStatus va_status = VA_STATUS_SUCCESS;
1110 memset(priv->slice_param_buffers,
1112 encoder->slice_num * sizeof(priv->slice_param_buffers[0]));
1113 set_slices_parameters(encoder,
1114 priv->slice_param_buffers,
1115 encoder->slice_num);
1117 if (VA_INVALID_ID != priv->slice_param_id) {
1118 vaDestroyBuffer(va_dpy, priv->slice_param_id);
1119 priv->slice_param_id = VA_INVALID_ID;
1121 va_status = vaCreateBuffer(va_dpy,
1123 VAEncSliceParameterBufferType,
1124 sizeof(priv->slice_param_buffers[0]),
1126 priv->slice_param_buffers,
1127 &priv->slice_param_id);
1128 ENCODER_CHECK_STATUS(VA_STATUS_SUCCESS == va_status,
1130 "creating slice-parameters buffer failed.");
1136 static EncoderStatus
1137 gst_vaapi_encoder_h264_rendering(
1138 GstVaapiBaseEncoder *base,
1139 GstVaapiSurface *surface,
1141 VABufferID coded_buf,
1145 EncoderStatus ret = ENCODER_NO_ERROR;
1146 VAStatus va_status = VA_STATUS_SUCCESS;
1147 GstVaapiEncoderH264 *encoder = GST_VAAPI_ENCODER_H264_CAST(base);
1148 GstVaapiEncoderH264Private *priv = encoder->priv;
1149 GstVaapiDisplay *display = ENCODER_DISPLAY(base);
1150 GstVaapiContext *context = ENCODER_CONTEXT(base);
1152 VAContextID context_id;
1153 VABufferID va_buffers[64];
1154 guint32 va_buffers_count = 0;
1155 gboolean is_params_ok = TRUE;
1156 gboolean is_locked = FALSE;
1158 ENCODER_ASSERT(context);
1160 va_dpy = ENCODER_VA_DISPLAY(base);
1161 context_id = ENCODER_VA_CONTEXT(base);
1163 *is_key = (priv->cur_slice_type == SLICE_TYPE_I);
1165 if (!priv->ref_surface1) {
1166 priv->ref_surface1 = gst_vaapi_context_get_surface(context);
1167 ENCODER_CHECK_STATUS(priv->ref_surface1,
1168 ENCODER_SURFACE_ERR,
1169 "reference surface, h264_pop_free_surface failed.");
1171 if (!priv->ref_surface2) {
1172 priv->ref_surface2 = gst_vaapi_context_get_surface(context);
1173 ENCODER_CHECK_STATUS(priv->ref_surface2,
1174 ENCODER_SURFACE_ERR,
1175 "reference surface, h264_pop_free_surface failed.");
1177 if (!priv->recon_surface) {
1178 priv->recon_surface = gst_vaapi_context_get_surface(context);
1179 ENCODER_CHECK_STATUS(priv->recon_surface,
1180 ENCODER_SURFACE_ERR,
1181 "reconstructed surface, h264_pop_free_surface failed.");
1184 if (SLICE_TYPE_P == priv->cur_slice_type) {
1185 h264_swap_surface(&priv->ref_surface1, &priv->ref_surface2);
1188 /* fill sequence parameters, need set every time */
1189 is_params_ok = h264_fill_sequence_buffer(encoder);
1190 ENCODER_CHECK_STATUS(is_params_ok,
1191 ENCODER_PARAMETER_ERR,
1192 "h264_recreate_seq_param failed");
1193 /* set pic_parameters*/
1194 is_params_ok = h264_fill_picture_buffer(encoder, coded_buf);
1195 ENCODER_CHECK_STATUS(is_params_ok,
1196 ENCODER_PARAMETER_ERR,
1197 "h264_recreate_pic_param failed");
1198 /* set slice parameters, support multiple slices */
1199 is_params_ok = h264_fill_slice_buffers(encoder);
1200 ENCODER_CHECK_STATUS(is_params_ok,
1201 ENCODER_PARAMETER_ERR,
1202 "h264_recreate_slice_param failed");
1205 ENCODER_ACQUIRE_DISPLAY_LOCK(display);
1207 /*render all buffers*/
1208 if (VA_INVALID_ID != priv->seq_param_id) {
1209 va_buffers[va_buffers_count++] = priv->seq_param_id;
1211 if (VA_INVALID_ID != priv->pic_param_id) {
1212 va_buffers[va_buffers_count++] = priv->pic_param_id;
1214 if (VA_INVALID_ID != priv->slice_param_id) {
1215 va_buffers[va_buffers_count++] = priv->slice_param_id;
1217 if (SLICE_TYPE_I == priv->cur_slice_type) {
1218 if (VA_INVALID_ID != priv->packed_seq_param_id) {
1219 va_buffers[va_buffers_count++] = priv->packed_seq_param_id;
1221 if (VA_INVALID_ID != priv->packed_seq_data_id) {
1222 va_buffers[va_buffers_count++] = priv->packed_seq_data_id;
1224 if (VA_INVALID_ID != priv->packed_pic_param_id) {
1225 va_buffers[va_buffers_count++] = priv->packed_pic_param_id;
1227 if (VA_INVALID_ID != priv->packed_pic_data_id) {
1228 va_buffers[va_buffers_count++] = priv->packed_pic_data_id;
1232 va_status = vaRenderPicture(va_dpy,
1236 ENCODER_CHECK_STATUS(VA_STATUS_SUCCESS == va_status,
1237 ENCODER_PICTURE_ERR,
1238 "vaRenderH264Picture failed.");
1240 /*after finished, swap recon and surface2*/
1241 if (SLICE_TYPE_P == priv->cur_slice_type ||
1242 SLICE_TYPE_I == priv->cur_slice_type) {
1243 h264_swap_surface(&priv->recon_surface, &priv->ref_surface2);
1247 ENCODER_RELEASE_DISPLAY_LOCK(display);
1251 static const guint8 *
1252 h264_next_nal(const guint8 *buffer, guint32 len, guint32 *nal_size)
1254 const guint8 *cur = buffer;
1255 const guint8 *end = buffer + len;
1256 const guint8 *nal_start = NULL;
1257 guint32 flag = 0xFFFFFFFF;
1258 guint32 nal_start_len = 0;
1260 ENCODER_ASSERT(len >= 0 && buffer && nal_size);
1263 nal_start = (len ? buffer : NULL);
1267 /*locate head postion*/
1268 if (!buffer[0] && !buffer[1]) {
1269 if (buffer[2] == 1) { // 0x000001
1271 } else if (!buffer[2] && len >=4 && buffer[3] == 1) { //0x00000001
1275 nal_start = buffer + nal_start_len;
1278 /*find next nal start position*/
1280 flag = ((flag<<8) | ((*cur++)&0xFF));
1281 if (flag == 0x00000001) {
1282 *nal_size = cur - 4 - nal_start;
1284 } else if ((flag&0x00FFFFFF) == 0x00000001) {
1285 *nal_size = cur - 3 - nal_start;
1290 *nal_size = end - nal_start;
1291 if (nal_start >= end) {
1299 gst_vaapi_encoder_h264_copy_coded_buffer(
1300 GstVaapiBaseEncoder *base,
1303 VABufferID *coded_buf
1306 GstVaapiEncoderH264 *encoder = GST_VAAPI_ENCODER_H264_CAST(base);
1307 GstVaapiEncoderH264Private *priv = encoder->priv;
1308 GstBuffer *ret_buffer;
1310 const guint8 *nal_start;
1313 ret_buffer = gst_buffer_new();
1314 ENCODER_ASSERT(ret_buffer);
1315 H264Bitstream bitstream;
1316 h264_bitstream_init(&bitstream, (frame_size+32)*8);
1317 h264_bitstream_align(&bitstream, 0);
1318 ENCODER_ASSERT(bitstream.bit_size == 0);
1320 if (!priv->avc_flag) { /*nal format*/
1321 h264_bitstream_write_byte_array(&bitstream, frame, frame_size);
1322 ENCODER_ASSERT(bitstream.bit_size == frame_size*8);
1323 } else { /* elementary format */
1324 frame_end = frame + frame_size;
1328 (nal_start = h264_next_nal(nal_start, frame_end-nal_start, &nal_size))
1330 ENCODER_ASSERT(nal_size);
1332 nal_start += nal_size;
1335 h264_bitstream_write_uint(&bitstream, nal_size, 32);
1336 h264_bitstream_write_byte_array(&bitstream, nal_start, nal_size);
1337 nal_start += nal_size;
1340 h264_bitstream_align(&bitstream, 0);
1342 GST_BUFFER_MALLOCDATA(ret_buffer) =
1343 GST_BUFFER_DATA(ret_buffer) = BIT_STREAM_BUFFER(&bitstream);
1344 GST_BUFFER_SIZE(ret_buffer) = BIT_STREAM_BIT_SIZE(&bitstream)/8;
1345 h264_bitstream_destroy(&bitstream, FALSE);
1350 static EncoderStatus
1351 read_sps_pps(GstVaapiEncoderH264Private *priv, const guint8 *buf, guint32 size)
1353 const guint8 *end = buf + size;
1354 const guint8 *nal_start = buf;
1355 guint32 nal_size = 0;
1357 GstBuffer *sps = NULL, *pps = NULL;
1359 while((!sps || !pps) &&
1360 (nal_start = h264_next_nal(nal_start, end-nal_start, &nal_size)) != NULL
1363 nal_start += nal_size;
1367 nal_type = (*nal_start)&0x1F;
1370 sps = gst_buffer_new_and_alloc(nal_size);
1371 memcpy(GST_BUFFER_DATA(sps), nal_start, nal_size);
1372 gst_buffer_replace(&priv->sps_data, sps);
1373 gst_buffer_unref(sps); /*don't set to NULL*/
1378 pps = gst_buffer_new_and_alloc(nal_size);
1379 memcpy(GST_BUFFER_DATA(pps), nal_start, nal_size);
1380 gst_buffer_replace(&priv->pps_data, pps);
1381 gst_buffer_unref(pps);
1388 nal_start += nal_size;
1392 return ENCODER_DATA_NOT_READY;
1395 return ENCODER_NO_ERROR;
1399 gst_vaapi_encoder_h264_notify_frame(
1400 GstVaapiBaseEncoder *base,
1405 GstVaapiEncoderH264 *encoder = GST_VAAPI_ENCODER_H264_CAST(base);
1406 GstVaapiEncoderH264Private *priv = encoder->priv;
1407 if (!priv->sps_data || !priv->pps_data) {
1408 read_sps_pps(priv, buf, size);
1410 if (priv->sps_data && priv->pps_data) {
1411 gst_vaapi_base_encoder_set_frame_notify(base, FALSE);
1416 read_sps_attributes(
1417 const guint8 *sps_data,
1419 guint32 *profile_idc,
1420 guint32 *profile_comp,
1424 ENCODER_ASSERT(profile_idc && profile_comp && level_idc);
1425 ENCODER_ASSERT(sps_size >= 4);
1429 /*skip sps_data[0], nal_type*/
1430 *profile_idc = sps_data[1];
1431 *profile_comp = sps_data[2];
1432 *level_idc = sps_data[3];
1436 static EncoderStatus
1437 gst_vaapi_encoder_h264_flush(
1438 GstVaapiEncoder* base,
1442 GstVaapiEncoderH264* encoder = GST_VAAPI_ENCODER_H264_CAST(base);
1443 EncoderStatus ret = ENCODER_NO_ERROR;
1444 GstVaapiEncoderH264Private *priv = encoder->priv;
1446 //priv->frame_count = 0;
1447 priv->cur_display_num = 0;
1448 priv->cur_decode_num = 0;
1449 priv->cur_slice_type = SLICE_TYPE_I;
1450 priv->gop_count = g_queue_get_length(priv->queued_buffers);
1451 //gst_vaapi_base_encoder_set_frame_notify((GST_VAAPI_BASE_ENCODER)encoder, TRUE);
1457 static EncoderStatus
1458 gst_vaapi_encoder_h264_get_avcC_codec_data(
1459 GstVaapiEncoderH264 *encoder,
1463 GstVaapiEncoderH264Private *priv = encoder->priv;
1464 GstBuffer *avc_codec;
1465 const guint32 configuration_version = 0x01;
1466 const guint32 length_size_minus_one = 0x03;
1467 guint32 profile, profile_comp, level_idc;
1469 ENCODER_ASSERT(buffer);
1470 if (!priv->sps_data || !priv->pps_data) {
1471 return ENCODER_DATA_NOT_READY;
1474 if (FALSE == read_sps_attributes(GST_BUFFER_DATA(priv->sps_data),
1475 GST_BUFFER_SIZE(priv->sps_data),
1476 &profile, &profile_comp, &level_idc))
1479 return ENCODER_DATA_ERR;
1482 H264Bitstream bitstream;
1483 h264_bitstream_init(&bitstream,
1484 (GST_BUFFER_SIZE(priv->sps_data) +
1485 GST_BUFFER_SIZE(priv->pps_data) + 32)*8);
1488 h264_bitstream_write_uint(&bitstream, configuration_version, 8);
1489 h264_bitstream_write_uint(&bitstream, profile, 8);
1490 h264_bitstream_write_uint(&bitstream, profile_comp, 8);
1491 h264_bitstream_write_uint(&bitstream, level_idc, 8);
1492 h264_bitstream_write_uint(&bitstream, h264_bit_mask[6], 6); /*111111*/
1493 h264_bitstream_write_uint(&bitstream, length_size_minus_one, 2);
1494 h264_bitstream_write_uint(&bitstream, h264_bit_mask[3], 3); /*111*/
1497 h264_bitstream_write_uint(&bitstream, 1, 5); /* sps count = 1*/
1498 ENCODER_ASSERT( BIT_STREAM_BIT_SIZE(&bitstream)%8 == 0);
1499 h264_bitstream_write_uint(&bitstream, GST_BUFFER_SIZE(priv->sps_data), 16);
1500 h264_bitstream_write_byte_array(&bitstream,
1501 GST_BUFFER_DATA(priv->sps_data),
1502 GST_BUFFER_SIZE(priv->sps_data));
1505 h264_bitstream_write_uint(&bitstream, 1, 8); /*pps count = 1*/
1506 h264_bitstream_write_uint(&bitstream, GST_BUFFER_SIZE(priv->pps_data), 16);
1507 h264_bitstream_write_byte_array(&bitstream,
1508 GST_BUFFER_DATA(priv->pps_data),
1509 GST_BUFFER_SIZE(priv->pps_data));
1511 avc_codec = gst_buffer_new();
1512 GST_BUFFER_MALLOCDATA(avc_codec) =
1513 GST_BUFFER_DATA(avc_codec) =
1514 BIT_STREAM_BUFFER(&bitstream);
1515 GST_BUFFER_SIZE(avc_codec) = BIT_STREAM_BIT_SIZE(&bitstream)/8;
1516 h264_bitstream_destroy(&bitstream, FALSE);
1517 *buffer = avc_codec;
1519 return ENCODER_NO_ERROR;
1522 static EncoderStatus
1523 gst_vaapi_encoder_h264_get_codec_data(
1524 GstVaapiEncoder* base,
1527 GstVaapiEncoderH264 *encoder = GST_VAAPI_ENCODER_H264_CAST(base);
1528 GstVaapiEncoderH264Private *priv = encoder->priv;
1531 return gst_vaapi_encoder_h264_get_avcC_codec_data(encoder, buffer);
1532 return ENCODER_NO_DATA;
1536 gst_vaapi_encoder_h264_init(GstVaapiEncoderH264 *encoder)
1538 GstVaapiEncoderH264Private *priv = GST_VAAPI_ENCODER_H264_GET_PRIVATE(encoder);
1539 ENCODER_ASSERT(priv);
1540 priv->public = encoder;
1541 encoder->priv = priv;
1543 /* init public attributes */
1544 gst_vaapi_encoder_h264_init_public_values(encoder);
1545 gst_vaapi_base_encoder_set_frame_notify(GST_VAAPI_BASE_ENCODER(encoder), TRUE);
1547 /* init private values*/
1548 priv->format = GST_MAKE_FOURCC('N','V','1','2');
1549 priv->avc_flag = FALSE;
1551 priv->ref_surface1 = NULL;
1552 priv->ref_surface2 = NULL;
1553 priv->recon_surface = NULL;
1555 priv->seq_param_id = VA_INVALID_ID;
1556 priv->pic_param_id = VA_INVALID_ID;
1557 priv->slice_param_id = VA_INVALID_ID;
1558 priv->packed_seq_param_id = VA_INVALID_ID;
1559 priv->packed_seq_data_id = VA_INVALID_ID;
1560 priv->packed_pic_param_id = VA_INVALID_ID;
1561 priv->packed_pic_data_id = VA_INVALID_ID;
1562 priv->slice_param_buffers = NULL;
1563 priv->default_slice_height = 0;
1564 priv->slice_mod_mb_num = 0;
1566 priv->sps_data = NULL;
1567 priv->pps_data = NULL;
1569 priv->queued_buffers = g_queue_new();
1570 priv->gop_count = 0;
1571 priv->cur_display_num = 0;
1572 priv->cur_decode_num = 0;
1573 priv->cur_slice_type = SLICE_TYPE_I;
1574 priv->last_decode_time = 0LL;
1575 priv->default_cts_offset = 0;
1577 priv->max_frame_num = 0;
1578 priv->max_pic_order_cnt = 0;
1583 gst_vaapi_encoder_h264_finalize(GObject *object)
1585 /*free private buffers*/
1586 GstVaapiEncoder *encoder = GST_VAAPI_ENCODER(object);
1587 GstVaapiEncoderH264Private *priv = GST_VAAPI_ENCODER_H264_GET_PRIVATE(object);
1589 if (gst_vaapi_encoder_get_state(encoder) != VAAPI_ENC_NULL) {
1590 gst_vaapi_encoder_uninitialize(encoder);
1593 if (priv->sps_data) {
1594 gst_buffer_unref(priv->sps_data);
1595 priv->sps_data = NULL;
1597 if (priv->pps_data) {
1598 gst_buffer_unref(priv->pps_data);
1599 priv->pps_data = NULL;
1601 if (priv->slice_param_buffers) {
1602 g_free(priv->slice_param_buffers);
1603 priv->slice_param_buffers = NULL;
1606 if (priv->queued_buffers) {
1607 ENCODER_ASSERT(g_queue_is_empty(priv->queued_buffers));
1608 g_queue_free(priv->queued_buffers);
1609 priv->queued_buffers = NULL;
1612 G_OBJECT_CLASS(gst_vaapi_encoder_h264_parent_class)->finalize(object);
1616 gst_vaapi_encoder_h264_class_init(GstVaapiEncoderH264Class *klass)
1618 GObjectClass * const object_class = G_OBJECT_CLASS(klass);
1619 GstVaapiEncoderClass * const encoder_class = GST_VAAPI_ENCODER_CLASS(klass);
1620 GstVaapiBaseEncoderClass * const base_class = GST_VAAPI_BASE_ENCODER_CLASS(klass);
1622 g_type_class_add_private(klass, sizeof(GstVaapiEncoderH264Private));
1624 GST_DEBUG_CATEGORY_INIT (gst_vaapi_h264_encoder_debug,
1625 "gst_va_h264_encoder",
1627 "gst_va_h264_encoder element");
1629 object_class->finalize = gst_vaapi_encoder_h264_finalize;
1631 base_class->validate_attributes = gst_vaapi_encoder_h264_validate_attributes;
1632 base_class->pre_alloc_resource = gst_vaapi_encoder_h264_alloc_slices;
1633 base_class->release_resource = gst_vaapi_encoder_h264_release_resource;
1634 base_class->prepare_next_input_buffer =
1635 gst_vaapi_encoder_h264_prepare_next_buffer;
1636 base_class->render_frame = gst_vaapi_encoder_h264_rendering;
1637 base_class->notify_frame = gst_vaapi_encoder_h264_notify_frame;
1638 base_class->copy_coded_frame = gst_vaapi_encoder_h264_copy_coded_buffer;
1639 base_class->encode_frame_failed = gst_vaapi_encoder_h264_frame_failed;
1641 encoder_class->flush = gst_vaapi_encoder_h264_flush;
1642 encoder_class->get_codec_data = gst_vaapi_encoder_h264_get_codec_data;
1646 h264_bitstream_init(H264Bitstream *bitstream, guint32 bit_capability)
1648 bitstream->bit_size = 0;
1649 bitstream->buffer = NULL;
1650 bitstream->max_bit_capability = 0;
1651 if (bit_capability) {
1652 h264_bitstream_auto_grow(bitstream, bit_capability);
1657 h264_bitstream_write_uint(
1658 H264Bitstream *bitstream,
1663 gboolean ret = TRUE;
1664 guint32 byte_pos, bit_offset;
1672 VAAPI_UNUSED_ARG(ret);
1673 ENCODER_CHECK_STATUS(h264_bitstream_auto_grow(bitstream, bit_size),
1675 "h264_bitstream_auto_grow failed.");
1676 byte_pos = (bitstream->bit_size>>3);
1677 bit_offset = (bitstream->bit_size&0x07);
1678 cur_byte = bitstream->buffer + byte_pos;
1679 ENCODER_ASSERT(bit_offset < 8 &&
1680 bitstream->bit_size <= bitstream->max_bit_capability);
1683 fill_bits = ((8-bit_offset) < bit_size ? (8-bit_offset) : bit_size);
1684 bit_size -= fill_bits;
1685 bitstream->bit_size += fill_bits;
1688 ((value>>bit_size) & h264_bit_mask[fill_bits])<<(8-bit_offset-fill_bits);
1692 ENCODER_ASSERT(cur_byte <=
1693 (bitstream->buffer + bitstream->max_bit_capability/8));
1700 h264_bitstream_align(H264Bitstream *bitstream, guint32 value)
1702 guint32 bit_offset, bit_left;
1704 bit_offset = (bitstream->bit_size&0x07);
1708 bit_left = 8 - bit_offset;
1709 if (value) value = h264_bit_mask[bit_left];
1710 return h264_bitstream_write_uint(bitstream, value, bit_left);
1715 h264_bitstream_write_byte_array(
1716 H264Bitstream *bitstream,
1721 gboolean ret = TRUE;
1726 VAAPI_UNUSED_ARG(ret);
1727 ENCODER_CHECK_STATUS(h264_bitstream_auto_grow(bitstream, byte_size<<3),
1729 "h264_bitstream_auto_grow failed.");
1730 if (0 == (bitstream->bit_size&0x07)) {
1731 memcpy(&bitstream->buffer[bitstream->bit_size>>3], buf, byte_size);
1732 bitstream->bit_size += (byte_size<<3);
1736 h264_bitstream_write_uint(bitstream, *buf, 8);
1747 h264_bitstream_write_ue(H264Bitstream *bitstream, guint32 value)
1749 gboolean ret = TRUE;
1750 guint32 size_in_bits = 0;
1751 guint32 tmp_value = ++value;
1756 ENCODER_CHECK_STATUS(h264_bitstream_write_uint(bitstream, 0, size_in_bits-1),
1758 "h264_bitstream_write_ue failed.");
1759 ENCODER_CHECK_STATUS(h264_bitstream_write_uint(bitstream, value, size_in_bits),
1761 "h264_bitstream_write_ue failed.");
1768 h264_bitstream_write_se(H264Bitstream *bitstream, gint32 value)
1770 gboolean ret = TRUE;
1774 new_val = -(value<<1);
1776 new_val = (value<<1) - 1;
1779 ENCODER_CHECK_STATUS(h264_bitstream_write_ue(bitstream, new_val),
1781 "h264_bitstream_write_se failed.");
1788 h264_bitstream_write_trailing_bits(H264Bitstream *bitstream)
1790 h264_bitstream_write_uint(bitstream, 1, 1);
1791 h264_bitstream_align(bitstream, 0);
1796 h264_bitstream_destroy(H264Bitstream *bitstream, gboolean free_flag)
1798 if (bitstream->buffer && free_flag) {
1799 free (bitstream->buffer);
1801 bitstream->buffer = NULL;
1802 bitstream->bit_size = 0;
1803 bitstream->max_bit_capability = 0;
1807 h264_bitstream_auto_grow(H264Bitstream *bitstream, guint32 extra_bit_size)
1809 guint32 new_bit_size = extra_bit_size + bitstream->bit_size;
1812 ENCODER_ASSERT(bitstream->bit_size <= bitstream->max_bit_capability);
1813 if (new_bit_size <= bitstream->max_bit_capability) {
1817 new_bit_size = ((new_bit_size + H264_BITSTREAM_ALLOC_ALIGN_MASK)
1818 &(~H264_BITSTREAM_ALLOC_ALIGN_MASK));
1819 ENCODER_ASSERT(new_bit_size%(H264_BITSTREAM_ALLOC_ALIGN_MASK+1) == 0);
1820 clear_pos = ((bitstream->bit_size+7)>>3);
1821 bitstream->buffer = realloc(bitstream->buffer, new_bit_size>>3);
1822 memset(bitstream->buffer+clear_pos, 0, (new_bit_size>>3)-clear_pos);
1823 bitstream->max_bit_capability = new_bit_size;
1828 h264_bitstream_write_nal_header(
1829 H264Bitstream *bitstream,
1834 h264_bitstream_write_uint(bitstream, 0, 1);
1835 h264_bitstream_write_uint(bitstream, nal_ref_idc, 2);
1836 h264_bitstream_write_uint(bitstream, nal_unit_type, 5);
1840 #if !HAVE_OLD_H264_ENCODER
1843 h264_bitstream_write_sps(
1844 H264Bitstream *bitstream,
1845 VAEncSequenceParameterBufferH264 *seq,
1846 H264_Profile profile
1849 guint32 constraint_set0_flag, constraint_set1_flag;
1850 guint32 constraint_set2_flag, constraint_set3_flag;
1851 guint32 gaps_in_frame_num_value_allowed_flag = 0; // ??
1853 guint32 b_qpprime_y_zero_transform_bypass = 0;
1854 guint32 residual_color_transform_flag = 0;
1855 guint32 pic_height_in_map_units =
1856 (seq->seq_fields.bits.frame_mbs_only_flag ?
1857 seq->picture_height_in_mbs :
1858 seq->picture_height_in_mbs/2);
1859 guint32 mb_adaptive_frame_field = !seq->seq_fields.bits.frame_mbs_only_flag;
1862 constraint_set0_flag = profile == H264_PROFILE_BASELINE;
1863 constraint_set1_flag = profile <= H264_PROFILE_MAIN;
1864 constraint_set2_flag = 0;
1865 constraint_set3_flag = 0;
1868 h264_bitstream_write_uint(bitstream, profile, 8);
1869 /* constraint_set0_flag */
1870 h264_bitstream_write_uint(bitstream, constraint_set0_flag, 1);
1871 /* constraint_set1_flag */
1872 h264_bitstream_write_uint(bitstream, constraint_set1_flag, 1);
1873 /* constraint_set2_flag */
1874 h264_bitstream_write_uint(bitstream, constraint_set2_flag, 1);
1875 /* constraint_set3_flag */
1876 h264_bitstream_write_uint(bitstream, constraint_set3_flag, 1);
1877 /* reserved_zero_4bits */
1878 h264_bitstream_write_uint(bitstream, 0, 4);
1880 h264_bitstream_write_uint(bitstream, seq->level_idc, 8);
1881 /* seq_parameter_set_id */
1882 h264_bitstream_write_ue(bitstream, seq->seq_parameter_set_id);
1884 if (profile >= H264_PROFILE_HIGH) {
1885 /* for high profile */
1887 /* chroma_format_idc = 1, 4:2:0*/
1888 h264_bitstream_write_ue(bitstream, seq->seq_fields.bits.chroma_format_idc);
1889 if (3 == seq->seq_fields.bits.chroma_format_idc) {
1890 h264_bitstream_write_uint(bitstream, residual_color_transform_flag, 1);
1892 /* bit_depth_luma_minus8 */
1893 h264_bitstream_write_ue(bitstream, seq->bit_depth_luma_minus8);
1894 /* bit_depth_chroma_minus8 */
1895 h264_bitstream_write_ue(bitstream, seq->bit_depth_chroma_minus8);
1896 /* b_qpprime_y_zero_transform_bypass */
1897 h264_bitstream_write_uint(bitstream, b_qpprime_y_zero_transform_bypass, 1);
1898 ENCODER_ASSERT(seq->seq_fields.bits.seq_scaling_matrix_present_flag == 0);
1899 /*seq_scaling_matrix_present_flag */
1900 h264_bitstream_write_uint(bitstream,
1901 seq->seq_fields.bits.seq_scaling_matrix_present_flag,
1905 if (seq->seq_fields.bits.seq_scaling_matrix_present_flag) {
1906 for (i = 0; i < (seq->seq_fields.bits.chroma_format_idc != 3 ? 8 : 12); i++) {
1907 h264_bitstream_write_uint(bitstream, seq->seq_fields.bits.seq_scaling_list_present_flag, 1);
1908 if (seq->seq_fields.bits.seq_scaling_list_present_flag) {
1910 /* FIXME, need write scaling list if seq_scaling_matrix_present_flag ==1*/
1917 /* log2_max_frame_num_minus4 */
1918 h264_bitstream_write_ue(bitstream,
1919 seq->seq_fields.bits.log2_max_frame_num_minus4);
1920 /* pic_order_cnt_type */
1921 h264_bitstream_write_ue(bitstream, seq->seq_fields.bits.pic_order_cnt_type);
1923 if (seq->seq_fields.bits.pic_order_cnt_type == 0) {
1924 /* log2_max_pic_order_cnt_lsb_minus4 */
1925 h264_bitstream_write_ue(bitstream,
1926 seq->seq_fields.bits.log2_max_pic_order_cnt_lsb_minus4);
1927 } else if (seq->seq_fields.bits.pic_order_cnt_type == 1) {
1929 h264_bitstream_write_uint(bitstream,
1930 seq->seq_fields.bits.delta_pic_order_always_zero_flag,
1932 h264_bitstream_write_se(bitstream, seq->offset_for_non_ref_pic);
1933 h264_bitstream_write_se(bitstream,
1934 seq->offset_for_top_to_bottom_field);
1935 h264_bitstream_write_ue(bitstream,
1936 seq->num_ref_frames_in_pic_order_cnt_cycle);
1937 for ( i = 0; i < seq->num_ref_frames_in_pic_order_cnt_cycle; i++) {
1938 h264_bitstream_write_se(bitstream, seq->offset_for_ref_frame[i]);
1942 /* num_ref_frames */
1943 h264_bitstream_write_ue(bitstream, seq->max_num_ref_frames);
1944 /* gaps_in_frame_num_value_allowed_flag */
1945 h264_bitstream_write_uint(bitstream,
1946 gaps_in_frame_num_value_allowed_flag,
1949 /* pic_width_in_mbs_minus1 */
1950 h264_bitstream_write_ue(bitstream, seq->picture_width_in_mbs - 1);
1951 /* pic_height_in_map_units_minus1 */
1952 h264_bitstream_write_ue(bitstream, pic_height_in_map_units - 1);
1953 /* frame_mbs_only_flag */
1954 h264_bitstream_write_uint(bitstream,
1955 seq->seq_fields.bits.frame_mbs_only_flag,
1958 if (!seq->seq_fields.bits.frame_mbs_only_flag) { //ONLY mbs
1960 h264_bitstream_write_uint(bitstream, mb_adaptive_frame_field, 1);
1963 /* direct_8x8_inference_flag */
1964 h264_bitstream_write_uint(bitstream, 0, 1);
1965 /* frame_cropping_flag */
1966 h264_bitstream_write_uint(bitstream, seq->frame_cropping_flag, 1);
1968 if (seq->frame_cropping_flag) {
1969 /* frame_crop_left_offset */
1970 h264_bitstream_write_ue(bitstream, seq->frame_crop_left_offset);
1971 /* frame_crop_right_offset */
1972 h264_bitstream_write_ue(bitstream, seq->frame_crop_right_offset);
1973 /* frame_crop_top_offset */
1974 h264_bitstream_write_ue(bitstream, seq->frame_crop_top_offset);
1975 /* frame_crop_bottom_offset */
1976 h264_bitstream_write_ue(bitstream, seq->frame_crop_bottom_offset);
1978 ENCODER_ASSERT(seq->vui_parameters_present_flag == FALSE);
1980 /* vui_parameters_present_flag */
1981 h264_bitstream_write_uint(bitstream, seq->vui_parameters_present_flag, 1);
1982 if (seq->vui_parameters_present_flag) {
1983 /*FIXME, to write vui parameters*/
1985 /* rbsp_trailing_bits */
1986 h264_bitstream_write_trailing_bits(bitstream);
1991 h264_bitstream_write_pps(
1992 H264Bitstream *bitstream,
1993 VAEncPictureParameterBufferH264 *pic
1996 guint32 num_slice_groups_minus1 = 0;
1997 guint32 pic_init_qs_minus26 = 0;
1998 guint32 redundant_pic_cnt_present_flag = 0;
2000 /* pic_parameter_set_id */
2001 h264_bitstream_write_ue(bitstream, pic->pic_parameter_set_id);
2002 /* seq_parameter_set_id */
2003 h264_bitstream_write_ue(bitstream, pic->seq_parameter_set_id);
2004 /* entropy_coding_mode_flag */
2005 h264_bitstream_write_uint(bitstream,
2006 pic->pic_fields.bits.entropy_coding_mode_flag,
2008 /* pic_order_present_flag */
2009 h264_bitstream_write_uint(bitstream,
2010 pic->pic_fields.bits.pic_order_present_flag,
2013 h264_bitstream_write_ue(bitstream, num_slice_groups_minus1);
2015 if (num_slice_groups_minus1 > 0) {
2019 h264_bitstream_write_ue(bitstream, pic->num_ref_idx_l0_active_minus1);
2020 h264_bitstream_write_ue(bitstream, pic->num_ref_idx_l1_active_minus1);
2021 h264_bitstream_write_uint(bitstream,
2022 pic->pic_fields.bits.weighted_pred_flag,
2024 h264_bitstream_write_uint(bitstream,
2025 pic->pic_fields.bits.weighted_bipred_idc,
2027 /* pic_init_qp_minus26 */
2028 h264_bitstream_write_se(bitstream, pic->pic_init_qp-26);
2029 /* pic_init_qs_minus26 */
2030 h264_bitstream_write_se(bitstream, pic_init_qs_minus26);
2031 /*chroma_qp_index_offset*/
2032 h264_bitstream_write_se(bitstream, pic->chroma_qp_index_offset);
2034 h264_bitstream_write_uint(bitstream,
2035 pic->pic_fields.bits.deblocking_filter_control_present_flag,
2037 h264_bitstream_write_uint(bitstream,
2038 pic->pic_fields.bits.constrained_intra_pred_flag,
2040 h264_bitstream_write_uint(bitstream, redundant_pic_cnt_present_flag, 1);
2043 h264_bitstream_write_uint(bitstream,
2044 pic->pic_fields.bits.transform_8x8_mode_flag,
2046 h264_bitstream_write_uint(bitstream,
2047 pic->pic_fields.bits.pic_scaling_matrix_present_flag,
2049 if (pic->pic_fields.bits.pic_scaling_matrix_present_flag) {
2054 (6+(-( (chroma_format_idc ! = 3) ? 2 : 6) * -pic->pic_fields.bits.transform_8x8_mode_flag));
2056 h264_bitstream_write_uint(bitstream, pic->pic_fields.bits.pic_scaling_list_present_flag, 1);
2061 h264_bitstream_write_se(bitstream, pic->second_chroma_qp_index_offset);
2062 h264_bitstream_write_trailing_bits(bitstream);