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
22 #include "gstvaapiencoder_h264.h"
28 #include <va/va_x11.h>
29 #if !HAVE_OLD_H264_ENCODER
30 #include <va/va_enc_h264.h>
35 #include "gst/gstclock.h"
36 #include "gst/gstvalue.h"
38 #include "gstvaapiobject.h"
39 #include "gstvaapiobject_priv.h"
40 #include "gstvaapicontext.h"
41 #include "gstvaapisurface.h"
42 #include "gstvaapivideobuffer.h"
43 #include "gstvaapidisplay_priv.h"
45 GST_DEBUG_CATEGORY_STATIC (gst_vaapi_h264_encoder_debug);
47 #define GST_CAT_DEFAULT gst_vaapi_h264_encoder_debug
49 #define GST_VAAPI_ENCODER_H264_CAST(encoder) ((GstVaapiEncoderH264 *)(encoder))
51 #define SHARE_CODED_BUF 0
53 #define DEFAULT_SURFACE_NUMBER 3
54 #define DEFAULT_CODEDBUF_NUM 5
55 #define DEFAULT_SID_INPUT 0 // suface_ids[0]
57 #define REF_RECON_SURFACE_NUM 2
59 #define ENTROPY_MODE_CAVLC 0
60 #define ENTROPY_MODE_CABAC 1
66 #define NAL_REF_IDC_NONE 0
67 #define NAL_REF_IDC_LOW 1
68 #define NAL_REF_IDC_MEDIUM 2
69 #define NAL_REF_IDC_HIGH 3
75 NAL_IDR = 5, /* ref_idc != 0 */
76 NAL_SEI = 6, /* ref_idc == 0 */
90 struct _GstVaapiEncoderH264Private {
91 GstVaapiEncoderH264 *public;
92 guint32 format; /*NV12, I420,*/
93 gboolean avc_flag; /*elementary flag*/
96 GQueue *video_buffer_caches; /*not used for baseline*/
98 GstVaapiSurface *ref_surface1; /* reference buffer*/
99 GstVaapiSurface *ref_surface2; /* for B frames */
100 GstVaapiSurface *recon_surface; /* reconstruct buffer*/
102 VABufferID seq_param_id;
103 VABufferID pic_param_id;
104 VABufferID slice_param_id;
105 VABufferID misc_param_hdr_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 gboolean is_seq_param_set;
111 #if HAVE_OLD_H264_ENCODER
112 VAEncSliceParameterBuffer *slice_param_buffers;
114 VAEncSliceParameterBufferH264 *slice_param_buffers;
116 guint32 default_slice_height;
117 guint32 slice_mod_mb_num;
118 guint32 default_cts_offset;
123 GQueue *queued_buffers; /* GstVaapiVideoBuffers with surface*/
126 guint32 cur_display_num;
127 guint32 cur_decode_num;
128 H264_SLICE_TYPE cur_slice_type;
129 guint64 last_decode_time;
130 guint32 max_frame_num;
131 guint32 max_pic_order_cnt;
135 G_DEFINE_TYPE(GstVaapiEncoderH264, gst_vaapi_encoder_h264, GST_TYPE_VAAPI_BASE_ENCODER)
138 #define H264_BITSTREAM_ALLOC_ALIGN_MASK 0x0FFF
140 #define BIT_STREAM_BUFFER(stream) ((stream)->buffer)
141 #define BIT_STREAM_BIT_SIZE(stream) ((stream)->bit_size)
143 struct _H264Bitstream {
146 guint32 max_bit_capability;
149 typedef struct _H264Bitstream H264Bitstream;
151 static const guint8 h264_bit_mask[9] = {0x00, 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F, 0xFF};
153 /* h264 bitstream functions */
155 h264_bitstream_init(H264Bitstream *bitstream, guint32 bit_capability);
158 h264_bitstream_write_uint(
159 H264Bitstream *bitstream,
165 h264_bitstream_align(H264Bitstream *bitstream, guint32 value);
168 h264_bitstream_write_ue(H264Bitstream *bitstream, guint32 value);
171 h264_bitstream_write_se(H264Bitstream *bitstream, gint32 value);
174 h264_bitstream_write_trailing_bits(H264Bitstream *bitstream);
177 h264_bitstream_write_byte_array(
178 H264Bitstream *bitstream,
184 h264_bitstream_destroy(H264Bitstream *bitstream, gboolean free_flag);
187 h264_bitstream_auto_grow(H264Bitstream *bitstream, guint32 extra_bit_size);
190 h264_bitstream_write_sps(
191 H264Bitstream *bitstream,
192 VAEncSequenceParameterBufferH264 *seq,
196 h264_bitstream_write_pps(
197 H264Bitstream *bitstream,
198 VAEncPictureParameterBufferH264 *pic
202 h264_bitstream_write_nal_header(
203 H264Bitstream *bitstream,
209 h264_get_va_profile(guint32 profile)
212 case H264_PROFILE_BASELINE:
213 return VAProfileH264Baseline;
215 case H264_PROFILE_MAIN:
216 return VAProfileH264Main;
218 case H264_PROFILE_HIGH:
219 return VAProfileH264High;
227 GstVaapiEncoderH264 *
228 gst_vaapi_encoder_h264_new(void)
230 return GST_VAAPI_ENCODER_H264_CAST(
231 g_object_new(GST_TYPE_VAAPI_ENCODER_H264, NULL));
235 gst_vaapi_encoder_h264_init_public_values(GstVaapiEncoderH264* encoder)
237 encoder->profile = 0;
239 encoder->bitrate = 0;
240 encoder->intra_period = 0;
241 encoder->init_qp = -1;
242 encoder->min_qp = -1;
243 encoder->slice_num = 0;
244 encoder->b_frame_num = 0;
248 gst_vaapi_encoder_h264_set_avc_flag(GstVaapiEncoderH264* encoder, gboolean avc)
250 GstVaapiEncoderH264Private *priv = encoder->priv;
251 priv->avc_flag = avc;
255 gst_vaapi_encoder_h264_get_avc_flag(GstVaapiEncoderH264* encoder)
257 GstVaapiEncoderH264Private *priv = encoder->priv;
258 return priv->avc_flag;
262 gst_vaapi_encoder_h264_validate_attributes(GstVaapiBaseEncoder *base)
264 GstVaapiEncoderH264 *encoder = GST_VAAPI_ENCODER_H264_CAST(base);
265 GstVaapiEncoderH264Private *priv = encoder->priv;
266 if (!ENCODER_WIDTH(encoder) ||
267 !ENCODER_HEIGHT(encoder) ||
268 !ENCODER_FPS(encoder)) {
271 if (!encoder->profile) {
272 encoder->profile = H264_DEFAULT_PROFILE;
274 gst_vaapi_base_encoder_set_va_profile(base, h264_get_va_profile(encoder->profile));
275 if (!encoder->level) {
276 if (encoder->profile <= H264_PROFILE_BASELINE)
277 encoder->level = H264_LEVEL_31;
279 encoder->level = H264_LEVEL_41;
281 if (!encoder->intra_period) {
282 encoder->intra_period = H264_DEFAULT_INTRA_PERIOD;
284 if (-1 == encoder->init_qp) {
285 encoder->init_qp = H264_DEFAULT_INIT_QP;
287 if (-1 == encoder->min_qp) {
288 if (GST_VAAPI_RATECONTROL_CQP == ENCODER_RATE_CONTROL(encoder))
289 encoder->min_qp = encoder->init_qp;
291 encoder->min_qp = H264_DEFAULT_MIN_QP;
294 if (encoder->min_qp > encoder->init_qp) {
295 encoder->min_qp = encoder->init_qp;
298 /* default compress ratio 1: (4*8*1.5) */
299 if (GST_VAAPI_RATECONTROL_CBR == ENCODER_RATE_CONTROL(encoder) ||
300 GST_VAAPI_RATECONTROL_VBR == ENCODER_RATE_CONTROL(encoder) ||
301 GST_VAAPI_RATECONTROL_VBR_CONSTRAINED == ENCODER_RATE_CONTROL(encoder))
303 if (!encoder->bitrate)
304 encoder->bitrate = ENCODER_WIDTH(encoder) *
305 ENCODER_HEIGHT(encoder) *
306 ENCODER_FPS(encoder) / 4 / 1024;
308 encoder->bitrate = 0;
310 if (!encoder->slice_num) {
311 encoder->slice_num = H264_DEFAULT_SLICE_NUM;
314 /* need calculate slice-num and each slice-height
315 suppose: ((encoder->height+15)/16) = 13, slice_num = 8
316 then: slice_1_height = 2
325 priv->default_slice_height = (ENCODER_HEIGHT(encoder)+15)/16/encoder->slice_num;
326 if (0 == priv->default_slice_height) { /* special value */
327 priv->default_slice_height = 1;
328 priv->slice_mod_mb_num = 0;
329 encoder->slice_num = (ENCODER_HEIGHT(encoder)+15)/16;
331 priv->slice_mod_mb_num = ((ENCODER_HEIGHT(encoder)+15)/16)%encoder->slice_num;
334 if (encoder->b_frame_num) {
335 priv->default_cts_offset = GST_SECOND/ENCODER_FPS(encoder);
337 priv->default_cts_offset = 0;
344 h264_encoder_release_parameters(GstVaapiEncoderH264 *encoder)
346 VAStatus va_status = VA_STATUS_SUCCESS;
347 GstVaapiEncoderH264Private *priv = encoder->priv;
348 GstVaapiDisplay *display = ENCODER_DISPLAY(encoder);
349 GstVaapiContext *context = ENCODER_CONTEXT(encoder);
351 ENCODER_ASSERT(display);
352 ENCODER_ASSERT(context);
353 VAAPI_UNUSED_ARG(va_status);
354 VADisplay va_dpy = gst_vaapi_display_get_display(display);
356 if (VA_INVALID_ID != priv->seq_param_id) {
357 va_status = vaDestroyBuffer(va_dpy, priv->seq_param_id);
358 priv->seq_param_id = VA_INVALID_ID;
360 if (VA_INVALID_ID != priv->pic_param_id) {
361 va_status = vaDestroyBuffer(va_dpy, priv->pic_param_id);
362 priv->pic_param_id = VA_INVALID_ID;
364 if (VA_INVALID_ID != priv->slice_param_id) {
365 va_status = vaDestroyBuffer(va_dpy, priv->slice_param_id);
366 priv->slice_param_id = VA_INVALID_ID;
368 if (VA_INVALID_ID != priv->misc_param_hdr_id) {
369 va_status = vaDestroyBuffer(va_dpy, priv->misc_param_hdr_id);
370 priv->misc_param_hdr_id = VA_INVALID_ID;
373 if (VA_INVALID_ID != priv->packed_seq_param_id) {
374 va_status = vaDestroyBuffer(va_dpy, priv->packed_seq_param_id);
375 priv->packed_seq_param_id = VA_INVALID_ID;
377 if (VA_INVALID_ID != priv->packed_seq_data_id) {
378 va_status = vaDestroyBuffer(va_dpy, priv->packed_seq_data_id);
379 priv->packed_seq_data_id = VA_INVALID_ID;
381 if (VA_INVALID_ID != priv->packed_pic_param_id) {
382 va_status = vaDestroyBuffer(va_dpy, priv->packed_pic_param_id);
383 priv->packed_pic_param_id = VA_INVALID_ID;
385 if (VA_INVALID_ID != priv->packed_pic_data_id) {
386 va_status = vaDestroyBuffer(va_dpy, priv->packed_pic_data_id);
387 priv->packed_pic_data_id = VA_INVALID_ID;
390 if (priv->slice_param_buffers) {
391 g_free(priv->slice_param_buffers);
392 priv->slice_param_buffers = NULL;
395 if (priv->sps_data) {
396 gst_buffer_unref(priv->sps_data);
397 priv->sps_data = NULL;
399 if (priv->pps_data) {
400 gst_buffer_unref(priv->pps_data);
401 priv->pps_data = NULL;
408 h264_release_queued_buffers(GstVaapiEncoderH264Private *priv)
410 while (!g_queue_is_empty(priv->queued_buffers)) {
411 GstBuffer* tmp = g_queue_pop_head(priv->queued_buffers);
413 gst_buffer_unref(tmp);
419 gst_vaapi_encoder_h264_release_resource(
420 GstVaapiBaseEncoder* base
423 GstVaapiEncoderH264* encoder = GST_VAAPI_ENCODER_H264_CAST(base);
425 GstVaapiEncoderH264Private *priv = encoder->priv;
426 GstVaapiContext *context = ENCODER_CONTEXT(base);
428 /* release buffers first */
429 h264_encoder_release_parameters(encoder);
430 h264_release_queued_buffers(priv);
431 priv->cur_display_num = 0;
432 priv->cur_decode_num = 0;
433 priv->cur_slice_type = SLICE_TYPE_I;
435 priv->last_decode_time = 0LL;
436 priv->default_cts_offset = 0;
437 priv->is_seq_param_set = FALSE;
439 /*remove ref_surface1*/
440 if (priv->ref_surface1) {
442 gst_vaapi_context_put_surface(context, priv->ref_surface1);
444 g_object_unref(priv->ref_surface1);
446 priv->ref_surface1 = NULL;
449 if (priv->ref_surface2) {
451 gst_vaapi_context_put_surface(context, priv->ref_surface2);
453 g_object_unref(priv->ref_surface2);
455 priv->ref_surface2 = NULL;
458 /*remove recon_surface*/
459 if (priv->recon_surface) {
461 gst_vaapi_context_put_surface(context, priv->recon_surface);
463 g_object_unref(priv->recon_surface);
465 priv->recon_surface = NULL;
472 gst_vaapi_encoder_h264_alloc_slices(
473 GstVaapiBaseEncoder *base,
474 GstVaapiContext *context
478 GstVaapiEncoderH264 *encoder = GST_VAAPI_ENCODER_H264_CAST(base);
479 GstVaapiEncoderH264Private *priv = encoder->priv;
481 priv->slice_param_buffers =
482 #if HAVE_OLD_H264_ENCODER
483 (VAEncSliceParameterBuffer*)
485 (VAEncSliceParameterBufferH264*)
487 g_malloc0_n(encoder->slice_num,
488 sizeof(priv->slice_param_buffers[0]));
494 gst_vaapi_encoder_h264_frame_failed(
495 GstVaapiBaseEncoder *base,
496 GstVaapiVideoBuffer* buffer
499 GstVaapiEncoderH264 *encoder = GST_VAAPI_ENCODER_H264_CAST(base);
500 GstVaapiEncoderH264Private *priv = encoder->priv;
502 h264_release_queued_buffers(priv);
503 priv->cur_display_num = 0;
504 priv->cur_decode_num = 0;
505 priv->cur_slice_type = SLICE_TYPE_I;
507 priv->last_decode_time = 0LL;
511 gst_vaapi_encoder_h264_prepare_next_buffer(
512 GstVaapiBaseEncoder* base,
513 GstBuffer *display_buf,
518 EncoderStatus ret = ENCODER_NO_ERROR;
519 GstVaapiEncoderH264 *encoder = GST_VAAPI_ENCODER_H264_CAST(base);
520 GstVaapiEncoderH264Private *priv = encoder->priv;
521 GstBuffer *return_buf = NULL;
524 if (NULL == display_buf && g_queue_is_empty(priv->queued_buffers)) {
525 ret = ENCODER_FRAME_IN_ORDER;
526 if (priv->gop_count >= encoder->intra_period || need_flush)
533 gst_buffer_ref(GST_BUFFER_CAST(display_buf));
534 priv->last_decode_time = GST_BUFFER_TIMESTAMP(display_buf);
538 if (priv->gop_count == 1) {
539 ENCODER_ASSERT(display_buf);
540 priv->cur_display_num = 0;
541 priv->cur_decode_num = 0;
542 priv->cur_slice_type = SLICE_TYPE_I;
544 return_buf = display_buf;
549 if (encoder->b_frame_num &&
550 priv->gop_count < encoder->intra_period &&
551 g_queue_get_length(priv->queued_buffers) < encoder->b_frame_num
554 g_queue_push_tail(priv->queued_buffers, display_buf);
555 ret = ENCODER_FRAME_IN_ORDER;
558 priv->cur_slice_type = SLICE_TYPE_P;
559 priv->cur_display_num = priv->gop_count-1;
560 ++priv->cur_decode_num;
561 return_buf = display_buf;
564 return_buf = (GstBuffer*)g_queue_pop_tail(priv->queued_buffers);
565 priv->cur_slice_type = SLICE_TYPE_P;
566 priv->cur_display_num = priv->gop_count - 1;
567 ++priv->cur_decode_num;
569 return_buf = (GstBuffer*)g_queue_pop_head(priv->queued_buffers);
570 priv->cur_slice_type = SLICE_TYPE_B;
571 priv->cur_display_num =
572 priv->gop_count - 2 - g_queue_get_length(priv->queued_buffers);
577 *out_buf = return_buf;
583 h264_swap_surface(GstVaapiSurface **s1, GstVaapiSurface **s2)
585 GstVaapiSurface *tmp;
587 g_return_if_fail(s1 && s2);
593 static inline const char *
594 get_slice_type(H264_SLICE_TYPE type)
608 #if HAVE_OLD_H264_ENCODER
611 set_sequence_parameters(
612 GstVaapiEncoderH264 *encoder,
613 VAEncSequenceParameterBufferH264 *seq_param
616 seq_param->seq_parameter_set_id = 0;
617 seq_param->level_idc = encoder->level; /* 3.0 */
618 seq_param->intra_period = encoder->intra_period;
619 seq_param->intra_idr_period = encoder->intra_period;
620 seq_param->max_num_ref_frames = 1; /*Only I, P frames*/
621 seq_param->picture_width_in_mbs = (ENCODER_WIDTH(encoder)+15)/16;
622 seq_param->picture_height_in_mbs = (ENCODER_HEIGHT(encoder)+15)/16;
624 seq_param->bits_per_second = encoder->bitrate * 1024;
625 seq_param->frame_rate = ENCODER_FPS(encoder);
626 seq_param->initial_qp = encoder->init_qp; /*qp_value; 15, 24, 26?*/
627 seq_param->min_qp = encoder->min_qp; /*1, 6, 10*/
628 seq_param->basic_unit_size = 0;
629 seq_param->vui_flag = FALSE;
635 set_picture_parameters(
636 GstVaapiEncoderH264 *encoder,
637 VAEncPictureParameterBufferH264 *pic_param,
641 GstVaapiEncoderH264Private *priv = encoder->priv;
643 pic_param->reference_picture = GST_VAAPI_OBJECT_ID(priv->ref_surface1);
644 pic_param->reconstructed_picture = GST_VAAPI_OBJECT_ID(priv->recon_surface);
645 pic_param->coded_buf = coded_buf;
646 pic_param->picture_width = ENCODER_WIDTH(encoder);
647 pic_param->picture_height = ENCODER_HEIGHT(encoder);
648 pic_param->last_picture = 0; // last pic or not
654 set_slices_parameters(
655 GstVaapiEncoderH264 *encoder,
656 VAEncSliceParameterBuffer *slices,
660 GstVaapiEncoderH264Private *priv = encoder->priv;
661 VAEncSliceParameterBuffer *slice_param;
664 guint32 last_row_num = 0;
665 guint32 slice_mod_num = priv->slice_mod_mb_num;
667 for (i = 0; i < slice_num; ++i) {
668 slice_param = &slices[i];
669 slice_param->start_row_number = last_row_num; /* unit MB*/
670 slice_param->slice_height = priv->default_slice_height; /* unit MB */
672 ++slice_param->slice_height;
675 last_row_num += slice_param->slice_height;
676 slice_param->slice_flags.bits.is_intra =
677 (priv->cur_slice_type == SLICE_TYPE_I);
678 slice_param->slice_flags.bits.disable_deblocking_filter_idc = FALSE;
679 slice_param->slice_flags.bits.uses_long_term_ref = FALSE;
680 slice_param->slice_flags.bits.is_long_term_ref = FALSE;
683 ENCODER_ASSERT(last_row_num == (ENCODER_HEIGHT(encoder)+15)/16);
687 #else /* extended libva, new parameter structures*/
690 set_sequence_parameters(
691 GstVaapiEncoderH264 *encoder,
692 VAEncSequenceParameterBufferH264 *seq_param
695 GstVaapiEncoderH264Private *priv = encoder->priv;
696 guint width_in_mbs, height_in_mbs;
698 width_in_mbs = (ENCODER_WIDTH(encoder)+15)/16;
699 height_in_mbs = (ENCODER_HEIGHT(encoder)+15)/16;
701 seq_param->seq_parameter_set_id = 0;
702 seq_param->level_idc = encoder->level; /* 3.0 */
703 seq_param->intra_period = encoder->intra_period;
704 seq_param->ip_period = 0; // ?
705 if (encoder->bitrate> 0)
706 seq_param->bits_per_second = encoder->bitrate * 1024;
708 seq_param->bits_per_second = 0;
710 seq_param->max_num_ref_frames =
711 (encoder->b_frame_num < 2 ? 3 : encoder->b_frame_num+1); // ?, why 4
712 seq_param->picture_width_in_mbs = width_in_mbs;
713 seq_param->picture_height_in_mbs = height_in_mbs;
715 /*sequence field values*/
716 seq_param->seq_fields.value = 0;
717 seq_param->seq_fields.bits.chroma_format_idc = 1;
718 seq_param->seq_fields.bits.frame_mbs_only_flag = 1;
719 seq_param->seq_fields.bits.mb_adaptive_frame_field_flag = FALSE;
720 seq_param->seq_fields.bits.seq_scaling_matrix_present_flag = FALSE;
721 /* direct_8x8_inference_flag default false */
722 seq_param->seq_fields.bits.direct_8x8_inference_flag = FALSE;
723 seq_param->seq_fields.bits.log2_max_frame_num_minus4 = 4; // log2(seq.intra_period)-3 : 0
724 /* picture order count */
725 seq_param->seq_fields.bits.pic_order_cnt_type = 0;
726 seq_param->seq_fields.bits.log2_max_pic_order_cnt_lsb_minus4 =
727 seq_param->seq_fields.bits.log2_max_frame_num_minus4 + 2;
728 seq_param->seq_fields.bits.delta_pic_order_always_zero_flag = TRUE;
730 priv->max_frame_num =
731 1<<(seq_param->seq_fields.bits.log2_max_frame_num_minus4 + 4);
732 priv->max_pic_order_cnt =
733 1 <<(seq_param->seq_fields.bits.log2_max_pic_order_cnt_lsb_minus4 + 4);
735 seq_param->bit_depth_luma_minus8 = 0;
736 seq_param->bit_depth_chroma_minus8 = 0;
738 /* not used if pic_order_cnt_type == 0 */
739 seq_param->num_ref_frames_in_pic_order_cnt_cycle = 0;
740 seq_param->offset_for_non_ref_pic = 0;
741 seq_param->offset_for_top_to_bottom_field = 0;
742 memset(seq_param->offset_for_ref_frame,
744 sizeof(seq_param->offset_for_ref_frame));
746 if (height_in_mbs*16 - ENCODER_HEIGHT(encoder)) {
747 seq_param->frame_cropping_flag = 1;
748 seq_param->frame_crop_left_offset = 0;
749 seq_param->frame_crop_right_offset = 0;
750 seq_param->frame_crop_top_offset = 0;
751 seq_param->frame_crop_bottom_offset =
752 ((height_in_mbs * 16 - ENCODER_HEIGHT(encoder))/
753 (2 * (!seq_param->seq_fields.bits.frame_mbs_only_flag + 1)));
756 if (h264_encoder->init_qp == -1)
757 seq.rate_control_method = BR_CBR;
758 else if (h264_encoder->init_qp == -2)
759 seq.rate_control_method = BR_VBR;
761 ENCODER_ASSERT(h264_encoder->init_qp >= 0 && h264_encoder->init_qp <= 51);
762 seq.rate_control_method = BR_CQP;
767 seq_param->vui_parameters_present_flag = (encoder->bitrate> 0 ? TRUE : FALSE);
768 if (seq_param->vui_parameters_present_flag) {
769 seq_param->vui_fields.bits.aspect_ratio_info_present_flag = FALSE;
770 seq_param->vui_fields.bits.bitstream_restriction_flag = FALSE;
771 seq_param->vui_fields.bits.timing_info_present_flag = (encoder->bitrate> 0 ? TRUE : FALSE);
772 if (seq_param->vui_fields.bits.timing_info_present_flag) {
773 seq_param->num_units_in_tick = 100;
774 seq_param->time_scale = ENCODER_FPS(encoder)*2*100;
781 ensure_packed_sps_data(
782 GstVaapiEncoderH264 *encoder,
783 VAEncSequenceParameterBufferH264 *seq_param
786 GstVaapiEncoderH264Private *priv = encoder->priv;
787 VAEncPackedHeaderParameterBuffer packed_header_param_buffer = { 0 };
788 VADisplay va_dpy = ENCODER_VA_DISPLAY(encoder);
789 VAContextID context_id = ENCODER_VA_CONTEXT(encoder);
790 guint32 length_in_bits;
791 guint8 *packed_seq_buffer = NULL;
792 H264Bitstream bitstream;
794 VAStatus va_status = VA_STATUS_SUCCESS;
799 h264_bitstream_init(&bitstream, 128*8);
800 h264_bitstream_write_uint(&bitstream, 0x00000001, 32); /* start code*/
801 h264_bitstream_write_nal_header(&bitstream, NAL_REF_IDC_HIGH, NAL_SPS);
802 h264_bitstream_write_sps(&bitstream, seq_param, encoder->profile);
803 ENCODER_ASSERT(BIT_STREAM_BIT_SIZE(&bitstream)%8 == 0);
804 length_in_bits = BIT_STREAM_BIT_SIZE(&bitstream);
805 packed_seq_buffer = BIT_STREAM_BUFFER(&bitstream);
807 /* set codec data sps */
808 priv->sps_data = gst_buffer_new_and_alloc((length_in_bits+7)/8);
809 GST_BUFFER_SIZE(priv->sps_data) = (length_in_bits+7)/8-4; /* start code size == 4*/
810 memcpy(GST_BUFFER_DATA(priv->sps_data),
812 GST_BUFFER_SIZE(priv->sps_data));
814 packed_header_param_buffer.type = VAEncPackedHeaderSequence;
815 packed_header_param_buffer.bit_length = length_in_bits;
816 packed_header_param_buffer.has_emulation_bytes = 0;
817 va_status = vaCreateBuffer(va_dpy,
819 VAEncPackedHeaderParameterBufferType,
820 sizeof(packed_header_param_buffer), 1,
821 &packed_header_param_buffer,
822 &priv->packed_seq_param_id);
823 ENCODER_CHECK_STATUS(VA_STATUS_SUCCESS == va_status,
825 "EncPackedSeqHeaderParameterBuffer failed");
826 va_status = vaCreateBuffer(va_dpy,
828 VAEncPackedHeaderDataBufferType,
829 (length_in_bits + 7) / 8, 1,
831 &priv->packed_seq_data_id);
832 h264_bitstream_destroy(&bitstream, TRUE);
833 ENCODER_CHECK_STATUS(VA_STATUS_SUCCESS == va_status,
835 "EncPackedSeqHeaderDataBuffer failed");
842 set_picture_parameters(
843 GstVaapiEncoderH264 *encoder,
844 VAEncPictureParameterBufferH264 *pic_param,
848 GstVaapiEncoderH264Private *priv = encoder->priv;
850 pic_param->pic_parameter_set_id = 0;
851 pic_param->seq_parameter_set_id = 0;
852 pic_param->last_picture = 0; /* means last encoding picture */
853 pic_param->frame_num = (priv->cur_slice_type == SLICE_TYPE_B ?
854 (priv->cur_decode_num + 1) : priv->cur_decode_num);
855 //pic_param.coding_type = 0;
856 pic_param->pic_init_qp = encoder->init_qp;
857 pic_param->num_ref_idx_l0_active_minus1 = 0; /* only 1 reference */
858 pic_param->num_ref_idx_l1_active_minus1 = 0; /* B frames only have 1 backward and 1 forward reference*/
859 pic_param->chroma_qp_index_offset = 0;
860 pic_param->second_chroma_qp_index_offset = 0;
862 /* set picture fields */
863 pic_param->pic_fields.value = 0;
864 pic_param->pic_fields.bits.idr_pic_flag = (priv->cur_slice_type == SLICE_TYPE_I);
865 pic_param->pic_fields.bits.reference_pic_flag = (priv->cur_slice_type != SLICE_TYPE_B);
866 pic_param->pic_fields.bits.entropy_coding_mode_flag = ENTROPY_MODE_CABAC;
867 pic_param->pic_fields.bits.weighted_pred_flag = FALSE;
868 pic_param->pic_fields.bits.weighted_bipred_idc = 0;
869 pic_param->pic_fields.bits.constrained_intra_pred_flag = 0;
870 pic_param->pic_fields.bits.transform_8x8_mode_flag = TRUE; /* enable 8x8 */
871 pic_param->pic_fields.bits.deblocking_filter_control_present_flag = TRUE; /* enable debloking */
872 pic_param->pic_fields.bits.redundant_pic_cnt_present_flag = FALSE;
873 /* bottom_field_pic_order_in_frame_present_flag */
874 pic_param->pic_fields.bits.pic_order_present_flag = FALSE;
875 pic_param->pic_fields.bits.pic_scaling_matrix_present_flag = FALSE;
877 /* reference list, */
878 pic_param->CurrPic.picture_id = GST_VAAPI_OBJECT_ID(priv->recon_surface);
879 pic_param->CurrPic.TopFieldOrderCnt = priv->cur_display_num * 2; // ??? /**/
880 pic_param->ReferenceFrames[0].picture_id = GST_VAAPI_OBJECT_ID(priv->ref_surface1);
881 pic_param->ReferenceFrames[1].picture_id = GST_VAAPI_OBJECT_ID(priv->ref_surface2);
882 pic_param->ReferenceFrames[2].picture_id = VA_INVALID_ID;
883 pic_param->coded_buf = coded_buf;
885 ENCODER_LOG_INFO("type:%s, frame_num:%d, display_num:%d",
886 get_slice_type(priv->cur_slice_type),
887 pic_param->frame_num,
888 pic_param->CurrPic.TopFieldOrderCnt);
893 ensure_packed_pps_data(
894 GstVaapiEncoderH264 *encoder,
895 VAEncPictureParameterBufferH264 *pic_param
898 GstVaapiEncoderH264Private *priv = encoder->priv;
899 VAEncPackedHeaderParameterBuffer packed_header_param_buffer = { 0 };
900 H264Bitstream bitstream;
901 VADisplay va_dpy = ENCODER_VA_DISPLAY(encoder);
902 VAContextID context_id = ENCODER_VA_CONTEXT(encoder);
903 guint32 length_in_bits;
904 guint8 *packed_pic_buffer = NULL;
906 VAStatus va_status = VA_STATUS_SUCCESS;
908 if (VA_INVALID_ID != priv->packed_pic_data_id)
911 h264_bitstream_init(&bitstream, 128*8);
912 h264_bitstream_write_uint(&bitstream, 0x00000001, 32); /* start code*/
913 h264_bitstream_write_nal_header(&bitstream, NAL_REF_IDC_HIGH, NAL_PPS);
914 h264_bitstream_write_pps(&bitstream, pic_param);
915 ENCODER_ASSERT(BIT_STREAM_BIT_SIZE(&bitstream)%8 == 0);
916 length_in_bits = BIT_STREAM_BIT_SIZE(&bitstream);
917 packed_pic_buffer = BIT_STREAM_BUFFER(&bitstream);
919 /*set codec data pps*/
920 priv->pps_data = gst_buffer_new_and_alloc((length_in_bits+7)/8);
921 GST_BUFFER_SIZE(priv->pps_data) = (length_in_bits+7)/8-4;
922 memcpy(GST_BUFFER_DATA(priv->pps_data),
924 GST_BUFFER_SIZE(priv->pps_data));
926 packed_header_param_buffer.type = VAEncPackedHeaderPicture;
927 packed_header_param_buffer.bit_length = length_in_bits;
928 packed_header_param_buffer.has_emulation_bytes = 0;
930 va_status = vaCreateBuffer(va_dpy,
932 VAEncPackedHeaderParameterBufferType,
933 sizeof(packed_header_param_buffer), 1,
934 &packed_header_param_buffer,
935 &priv->packed_pic_param_id);
936 ENCODER_CHECK_STATUS(VA_STATUS_SUCCESS == va_status,
938 "EncPackedPicHeaderParameterBuffer failed");
940 va_status = vaCreateBuffer(va_dpy,
942 VAEncPackedHeaderDataBufferType,
943 (length_in_bits + 7) / 8, 1,
945 &priv->packed_pic_data_id);
946 h264_bitstream_destroy(&bitstream, TRUE);
947 ENCODER_CHECK_STATUS(VA_STATUS_SUCCESS == va_status,
949 "EncPackedPicHeaderDataBuffer failed");
955 set_slices_parameters(
956 GstVaapiEncoderH264 *encoder,
957 VAEncSliceParameterBufferH264 *slices,
961 GstVaapiEncoderH264Private *priv = encoder->priv;
962 VAEncSliceParameterBufferH264 *slice_param;
964 guint width_in_mbs = (ENCODER_WIDTH(encoder)+15)/16;
966 guint32 last_row_num = 0;
967 guint32 slice_mod_num = priv->slice_mod_mb_num;
969 for (i = 0; i < slice_num; ++i) {
971 slice_param = slices + i;
973 slice_param->macroblock_address = last_row_num*width_in_mbs;
974 slice_param->num_macroblocks = width_in_mbs*priv->default_slice_height;
975 last_row_num += priv->default_slice_height;
977 slice_param->num_macroblocks += width_in_mbs;
981 slice_param->macroblock_info = VA_INVALID_ID;
982 slice_param->slice_type = priv->cur_slice_type;
983 slice_param->pic_parameter_set_id = 0;
984 slice_param->idr_pic_id = priv->idr_num;
985 slice_param->pic_order_cnt_lsb =
986 (priv->cur_display_num*2) % priv->max_pic_order_cnt;
988 /* not used if pic_order_cnt_type = 0 */
989 slice_param->delta_pic_order_cnt_bottom = 0;
990 memset(slice_param->delta_pic_order_cnt,
992 sizeof(slice_param->delta_pic_order_cnt));
994 /*only works for B frames*/
995 slice_param->direct_spatial_mv_pred_flag = FALSE;
996 /* default equal to picture parameters */
997 slice_param->num_ref_idx_active_override_flag = FALSE;
998 slice_param->num_ref_idx_l0_active_minus1 = 0;
999 slice_param->num_ref_idx_l1_active_minus1 = 0;
1001 slice_param->RefPicList0[0].picture_id =
1002 GST_VAAPI_OBJECT_ID(priv->ref_surface1);
1004 i_pic < sizeof(slice_param->RefPicList0)/sizeof(slice_param->RefPicList0[0]);
1006 slice_param->RefPicList0[i_pic].picture_id = VA_INVALID_ID;
1009 if (SLICE_TYPE_B == priv->cur_slice_type) {
1010 slice_param->RefPicList1[0].picture_id =
1011 GST_VAAPI_OBJECT_ID(priv->ref_surface2);
1016 i_pic < sizeof(slice_param->RefPicList1)/sizeof(slice_param->RefPicList1[0]);
1018 slice_param->RefPicList1[i_pic].picture_id = VA_INVALID_ID;
1020 /* not used if pic_param.pic_fields.bits.weighted_pred_flag == FALSE */
1021 slice_param->luma_log2_weight_denom = 0;
1022 slice_param->chroma_log2_weight_denom = 0;
1023 slice_param->luma_weight_l0_flag = FALSE;
1024 memset(slice_param->luma_weight_l0, 0, sizeof(slice_param->luma_weight_l0));
1025 memset(slice_param->luma_offset_l0, 0, sizeof(slice_param->luma_offset_l0));
1026 slice_param->chroma_weight_l0_flag = FALSE;
1027 memset(slice_param->chroma_weight_l0, 0, sizeof(slice_param->chroma_weight_l0));
1028 memset(slice_param->chroma_offset_l0, 0, sizeof(slice_param->chroma_offset_l0));
1029 slice_param->luma_weight_l1_flag = FALSE;
1030 memset(slice_param->luma_weight_l1, 0, sizeof(slice_param->luma_weight_l1));
1031 memset(slice_param->luma_offset_l1, 0, sizeof(slice_param->luma_offset_l1));
1032 slice_param->chroma_weight_l1_flag = FALSE;
1033 memset(slice_param->chroma_weight_l1, 0, sizeof(slice_param->chroma_weight_l1));
1034 memset(slice_param->chroma_offset_l1, 0, sizeof(slice_param->chroma_offset_l1));
1036 slice_param->cabac_init_idc = 0;
1037 slice_param->slice_qp_delta = encoder->init_qp - encoder->min_qp;
1038 if (slice_param->slice_qp_delta > 4)
1039 slice_param->slice_qp_delta = 4;
1040 slice_param->disable_deblocking_filter_idc = 0;
1041 slice_param->slice_alpha_c0_offset_div2 = 2;
1042 slice_param->slice_beta_offset_div2 = 2;
1045 ENCODER_ASSERT(last_row_num == (ENCODER_HEIGHT(encoder)+15)/16);
1050 h264_fill_hdr_buffer(GstVaapiEncoderH264 *encoder)
1052 GstVaapiEncoderH264Private *priv = encoder->priv;
1053 VAEncMiscParameterBuffer *misc_param;
1054 VAEncMiscParameterHRD *misc_hrd_param;
1055 VADisplay va_dpy = ENCODER_VA_DISPLAY(encoder);
1056 VAContextID context_id = ENCODER_VA_CONTEXT(encoder);
1057 gboolean ret = TRUE;
1058 VAStatus va_status = VA_STATUS_SUCCESS;
1060 if (VA_INVALID_ID != priv->misc_param_hdr_id) {
1061 vaDestroyBuffer(va_dpy, priv->misc_param_hdr_id);
1062 priv->misc_param_hdr_id = VA_INVALID_ID;
1066 va_status = vaCreateBuffer(
1069 VAEncMiscParameterBufferType,
1070 sizeof(VAEncMiscParameterBuffer) + sizeof(VAEncMiscParameterRateControl),
1073 &priv->misc_param_hdr_id);
1074 ENCODER_CHECK_STATUS(VA_STATUS_SUCCESS == va_status,
1076 "vaCreateEncMiscParameterBuffer failed");
1078 va_status = vaMapBuffer(va_dpy,
1079 priv->misc_param_hdr_id,
1080 (void **)&misc_param);
1081 ENCODER_CHECK_STATUS(VA_STATUS_SUCCESS == va_status,
1083 "H264 HDR buffer map failed");
1084 misc_param->type = VAEncMiscParameterTypeHRD;
1085 misc_hrd_param = (VAEncMiscParameterHRD *)misc_param->data;
1087 if (encoder->bitrate > 0) {
1088 misc_hrd_param->initial_buffer_fullness = encoder->bitrate * 1024 * 4;
1089 misc_hrd_param->buffer_size = encoder->bitrate * 1024 * 8;
1091 misc_hrd_param->initial_buffer_fullness = 0;
1092 misc_hrd_param->buffer_size = 0;
1095 vaUnmapBuffer(va_dpy, priv->misc_param_hdr_id);
1103 h264_fill_sequence_buffer(GstVaapiEncoderH264 *encoder)
1105 GstVaapiEncoderH264Private *priv = encoder->priv;
1106 VAEncSequenceParameterBufferH264 seq_param = { 0 };
1107 VADisplay va_dpy = ENCODER_VA_DISPLAY(encoder);
1108 VAContextID context_id = ENCODER_VA_CONTEXT(encoder);
1109 gboolean ret = TRUE;
1110 VAStatus va_status = VA_STATUS_SUCCESS;
1113 if (VA_INVALID_ID != priv->seq_param_id)
1116 set_sequence_parameters(encoder, &seq_param);
1117 va_status = vaCreateBuffer(va_dpy, context_id,
1118 VAEncSequenceParameterBufferType,
1119 sizeof(seq_param), 1,
1120 &seq_param, &priv->seq_param_id);
1121 ENCODER_CHECK_STATUS(VA_STATUS_SUCCESS == va_status,
1123 "alloc seq-buffer failed.");
1125 #if !HAVE_OLD_H264_ENCODER
1126 ensure_packed_sps_data(encoder, &seq_param);
1134 h264_fill_picture_buffer(
1135 GstVaapiEncoderH264 *encoder,
1136 VABufferID coded_buf
1139 GstVaapiEncoderH264Private *priv = encoder->priv;
1140 VAEncPictureParameterBufferH264 pic_param;
1141 VADisplay va_dpy = ENCODER_VA_DISPLAY(encoder);
1142 VAContextID context_id = ENCODER_VA_CONTEXT(encoder);
1143 gboolean ret = TRUE;
1144 VAStatus va_status = VA_STATUS_SUCCESS;
1146 VAAPI_UNUSED_ARG(va_status);
1147 memset(&pic_param, 0, sizeof(pic_param));
1148 set_picture_parameters(encoder, &pic_param, coded_buf);
1150 if (VA_INVALID_ID != priv->pic_param_id) { /* share the same pic_param_id*/
1151 vaDestroyBuffer(va_dpy, priv->pic_param_id);
1152 priv->pic_param_id = VA_INVALID_ID;
1154 va_status = vaCreateBuffer(va_dpy,
1156 VAEncPictureParameterBufferType,
1157 sizeof(pic_param), 1,
1159 &priv->pic_param_id);
1161 ENCODER_CHECK_STATUS(VA_STATUS_SUCCESS == va_status,
1163 "creating pic-param buffer failed.");
1164 #if !HAVE_OLD_H264_ENCODER
1165 ensure_packed_pps_data(encoder, &pic_param);
1173 h264_fill_slice_buffers(
1174 GstVaapiEncoderH264 *encoder
1177 GstVaapiEncoderH264Private *priv = encoder->priv;
1178 VADisplay va_dpy = ENCODER_VA_DISPLAY(encoder);
1179 VAContextID context_id = ENCODER_VA_CONTEXT(encoder);
1180 gboolean ret = TRUE;
1181 VAStatus va_status = VA_STATUS_SUCCESS;
1183 memset(priv->slice_param_buffers,
1185 encoder->slice_num * sizeof(priv->slice_param_buffers[0]));
1186 set_slices_parameters(encoder,
1187 priv->slice_param_buffers,
1188 encoder->slice_num);
1190 if (VA_INVALID_ID != priv->slice_param_id) {
1191 vaDestroyBuffer(va_dpy, priv->slice_param_id);
1192 priv->slice_param_id = VA_INVALID_ID;
1194 va_status = vaCreateBuffer(va_dpy,
1196 VAEncSliceParameterBufferType,
1197 sizeof(priv->slice_param_buffers[0]),
1199 priv->slice_param_buffers,
1200 &priv->slice_param_id);
1201 ENCODER_CHECK_STATUS(VA_STATUS_SUCCESS == va_status,
1203 "creating slice-parameters buffer failed.");
1209 static EncoderStatus
1210 gst_vaapi_encoder_h264_rendering(
1211 GstVaapiBaseEncoder *base,
1212 GstVaapiSurface *surface,
1214 VABufferID coded_buf,
1218 EncoderStatus ret = ENCODER_NO_ERROR;
1219 GstVaapiEncoderH264 *encoder = GST_VAAPI_ENCODER_H264_CAST(base);
1220 GstVaapiEncoderH264Private *priv = encoder->priv;
1221 GstVaapiContext *context = ENCODER_CONTEXT(base);
1222 VABufferID va_buffers[64];
1223 guint32 va_buffers_count = 0;
1224 gboolean is_params_ok = TRUE;
1226 ENCODER_ASSERT(context);
1228 *is_key = (priv->cur_slice_type == SLICE_TYPE_I);
1230 if (!priv->ref_surface1) {
1231 priv->ref_surface1 = gst_vaapi_context_get_surface(context);
1232 ENCODER_CHECK_STATUS(priv->ref_surface1,
1233 ENCODER_SURFACE_ERR,
1234 "reference surface, h264_pop_free_surface failed.");
1236 if (!priv->ref_surface2) {
1237 priv->ref_surface2 = gst_vaapi_context_get_surface(context);
1238 ENCODER_CHECK_STATUS(priv->ref_surface2,
1239 ENCODER_SURFACE_ERR,
1240 "reference surface, h264_pop_free_surface failed.");
1242 if (!priv->recon_surface) {
1243 priv->recon_surface = gst_vaapi_context_get_surface(context);
1244 ENCODER_CHECK_STATUS(priv->recon_surface,
1245 ENCODER_SURFACE_ERR,
1246 "reconstructed surface, h264_pop_free_surface failed.");
1249 if (SLICE_TYPE_P == priv->cur_slice_type) {
1250 h264_swap_surface(&priv->ref_surface1, &priv->ref_surface2);
1253 /* fill sequence parameters, need set every time */
1254 is_params_ok = h264_fill_sequence_buffer(encoder);
1255 ENCODER_CHECK_STATUS(is_params_ok,
1256 ENCODER_PARAMETER_ERR,
1257 "h264_recreate_seq_param failed");
1258 /* set pic_parameters*/
1259 is_params_ok = h264_fill_picture_buffer(encoder, coded_buf);
1260 ENCODER_CHECK_STATUS(is_params_ok,
1261 ENCODER_PARAMETER_ERR,
1262 "h264_recreate_pic_param failed");
1264 #if !HAVE_OLD_H264_ENCODER
1265 /* set misc_hdr_parameters*/
1266 is_params_ok = h264_fill_hdr_buffer(encoder);
1267 ENCODER_CHECK_STATUS(is_params_ok,
1268 ENCODER_PARAMETER_ERR,
1269 "h264_fill_hdr__param failed");
1272 /* set slice parameters, support multiple slices */
1273 is_params_ok = h264_fill_slice_buffers(encoder);
1274 ENCODER_CHECK_STATUS(is_params_ok,
1275 ENCODER_PARAMETER_ERR,
1276 "h264_recreate_slice_param failed");
1278 /*render all buffers*/
1279 if (VA_INVALID_ID != priv->seq_param_id) {
1280 #if HAVE_OLD_H264_ENCODER
1281 if (!priv->is_seq_param_set) {
1282 priv->is_seq_param_set = TRUE;
1283 va_buffers[va_buffers_count++] = priv->seq_param_id;
1286 va_buffers[va_buffers_count++] = priv->seq_param_id;
1289 if (VA_INVALID_ID != priv->pic_param_id) {
1290 va_buffers[va_buffers_count++] = priv->pic_param_id;
1292 if (VA_INVALID_ID != priv->misc_param_hdr_id) {
1293 va_buffers[va_buffers_count++] = priv->misc_param_hdr_id;
1295 if (VA_INVALID_ID != priv->slice_param_id) {
1296 va_buffers[va_buffers_count++] = priv->slice_param_id;
1298 if (SLICE_TYPE_I == priv->cur_slice_type) {
1299 if (VA_INVALID_ID != priv->packed_seq_param_id) {
1300 va_buffers[va_buffers_count++] = priv->packed_seq_param_id;
1302 if (VA_INVALID_ID != priv->packed_seq_data_id) {
1303 va_buffers[va_buffers_count++] = priv->packed_seq_data_id;
1305 if (VA_INVALID_ID != priv->packed_pic_param_id) {
1306 va_buffers[va_buffers_count++] = priv->packed_pic_param_id;
1308 if (VA_INVALID_ID != priv->packed_pic_data_id) {
1309 va_buffers[va_buffers_count++] = priv->packed_pic_data_id;
1312 ret = gst_vaapi_encoder_render_picture(GST_VAAPI_ENCODER_CAST(encoder),
1316 ENCODER_CHECK_STATUS(ret == ENCODER_NO_ERROR,
1317 ENCODER_PICTURE_ERR,
1318 "vaRenderH264Picture failed.");
1320 /*after finished, swap recon and surface2*/
1321 if (SLICE_TYPE_P == priv->cur_slice_type ||
1322 SLICE_TYPE_I == priv->cur_slice_type) {
1323 h264_swap_surface(&priv->recon_surface, &priv->ref_surface2);
1330 static const guint8 *
1331 h264_next_nal(const guint8 *buffer, guint32 len, guint32 *nal_size)
1333 const guint8 *cur = buffer;
1334 const guint8 *end = buffer + len;
1335 const guint8 *nal_start = NULL;
1336 guint32 flag = 0xFFFFFFFF;
1337 guint32 nal_start_len = 0;
1339 ENCODER_ASSERT(len >= 0 && buffer && nal_size);
1342 nal_start = (len ? buffer : NULL);
1346 /*locate head postion*/
1347 if (!buffer[0] && !buffer[1]) {
1348 if (buffer[2] == 1) { // 0x000001
1350 } else if (!buffer[2] && len >=4 && buffer[3] == 1) { //0x00000001
1354 nal_start = buffer + nal_start_len;
1357 /*find next nal start position*/
1359 flag = ((flag<<8) | ((*cur++)&0xFF));
1360 if ((flag&0x00FFFFFF) == 0x00000001) {
1361 if (flag == 0x00000001)
1362 *nal_size = cur - 4 - nal_start;
1364 *nal_size = cur - 3 - nal_start;
1369 *nal_size = end - nal_start;
1370 if (nal_start >= end) {
1378 gst_vaapi_encoder_h264_wrap_buffer(
1379 GstVaapiBaseEncoder *base,
1383 GstVaapiEncoderH264 *encoder = GST_VAAPI_ENCODER_H264_CAST(base);
1384 GstVaapiEncoderH264Private *priv = encoder->priv;
1385 GstBuffer *ret_buffer;
1387 const guint8 *nal_start;
1389 H264Bitstream bitstream;
1391 if (!priv->avc_flag) {
1392 gst_buffer_ref(buf);
1396 ret_buffer = gst_buffer_new();
1397 ENCODER_ASSERT(ret_buffer);
1398 h264_bitstream_init(&bitstream, (GST_BUFFER_SIZE(buf)+32)*8);
1399 h264_bitstream_align(&bitstream, 0);
1400 ENCODER_ASSERT(bitstream.bit_size == 0);
1403 frame_end = GST_BUFFER_DATA(buf) + GST_BUFFER_SIZE(buf);
1404 nal_start = GST_BUFFER_DATA(buf);
1407 (nal_start = h264_next_nal(nal_start, frame_end-nal_start, &nal_size))
1409 ENCODER_ASSERT(nal_size);
1411 nal_start += nal_size;
1414 h264_bitstream_write_uint(&bitstream, nal_size, 32);
1415 h264_bitstream_write_byte_array(&bitstream, nal_start, nal_size);
1416 nal_start += nal_size;
1418 h264_bitstream_align(&bitstream, 0);
1420 GST_BUFFER_MALLOCDATA(ret_buffer) =
1421 GST_BUFFER_DATA(ret_buffer) = BIT_STREAM_BUFFER(&bitstream);
1422 GST_BUFFER_SIZE(ret_buffer) = BIT_STREAM_BIT_SIZE(&bitstream)/8;
1423 h264_bitstream_destroy(&bitstream, FALSE);
1428 static EncoderStatus
1429 read_sps_pps(GstVaapiEncoderH264Private *priv, const guint8 *buf, guint32 size)
1431 const guint8 *end = buf + size;
1432 const guint8 *nal_start = buf;
1433 guint32 nal_size = 0;
1435 GstBuffer *sps = NULL, *pps = NULL;
1437 while((!sps || !pps) &&
1438 (nal_start = h264_next_nal(nal_start, end-nal_start, &nal_size)) != NULL
1441 nal_start += nal_size;
1445 nal_type = (*nal_start)&0x1F;
1448 sps = gst_buffer_new_and_alloc(nal_size);
1449 memcpy(GST_BUFFER_DATA(sps), nal_start, nal_size);
1450 gst_buffer_replace(&priv->sps_data, sps);
1451 gst_buffer_unref(sps); /*don't set to NULL*/
1456 pps = gst_buffer_new_and_alloc(nal_size);
1457 memcpy(GST_BUFFER_DATA(pps), nal_start, nal_size);
1458 gst_buffer_replace(&priv->pps_data, pps);
1459 gst_buffer_unref(pps);
1466 nal_start += nal_size;
1470 return ENCODER_DATA_NOT_READY;
1473 return ENCODER_NO_ERROR;
1477 gst_vaapi_encoder_h264_notify_frame(
1478 GstVaapiBaseEncoder *base,
1483 GstVaapiEncoderH264 *encoder = GST_VAAPI_ENCODER_H264_CAST(base);
1484 GstVaapiEncoderH264Private *priv = encoder->priv;
1485 if (!priv->sps_data || !priv->pps_data) {
1486 read_sps_pps(priv, buf, size);
1488 if (priv->sps_data && priv->pps_data) {
1489 gst_vaapi_base_encoder_set_frame_notify(base, FALSE);
1494 read_sps_attributes(
1495 const guint8 *sps_data,
1497 guint32 *profile_idc,
1498 guint32 *profile_comp,
1502 ENCODER_ASSERT(profile_idc && profile_comp && level_idc);
1503 ENCODER_ASSERT(sps_size >= 4);
1507 /*skip sps_data[0], nal_type*/
1508 *profile_idc = sps_data[1];
1509 *profile_comp = sps_data[2];
1510 *level_idc = sps_data[3];
1514 static EncoderStatus
1515 gst_vaapi_encoder_h264_flush(
1516 GstVaapiEncoder* base
1519 GstVaapiEncoderH264* encoder = GST_VAAPI_ENCODER_H264_CAST(base);
1520 EncoderStatus ret = ENCODER_NO_ERROR;
1521 GstVaapiEncoderH264Private *priv = encoder->priv;
1523 //priv->frame_count = 0;
1524 priv->cur_display_num = 0;
1525 priv->cur_decode_num = 0;
1526 priv->cur_slice_type = SLICE_TYPE_I;
1527 priv->gop_count = g_queue_get_length(priv->queued_buffers);
1528 //gst_vaapi_base_encoder_set_frame_notify((GST_VAAPI_BASE_ENCODER)encoder, TRUE);
1534 static EncoderStatus
1535 gst_vaapi_encoder_h264_get_avcC_codec_data(
1536 GstVaapiEncoderH264 *encoder,
1540 GstVaapiEncoderH264Private *priv = encoder->priv;
1541 GstBuffer *avc_codec;
1542 const guint32 configuration_version = 0x01;
1543 const guint32 length_size_minus_one = 0x03;
1544 guint32 profile, profile_comp, level_idc;
1546 ENCODER_ASSERT(buffer);
1547 if (!priv->sps_data || !priv->pps_data) {
1548 return ENCODER_DATA_NOT_READY;
1551 if (FALSE == read_sps_attributes(GST_BUFFER_DATA(priv->sps_data),
1552 GST_BUFFER_SIZE(priv->sps_data),
1553 &profile, &profile_comp, &level_idc))
1556 return ENCODER_DATA_ERR;
1559 H264Bitstream bitstream;
1560 h264_bitstream_init(&bitstream,
1561 (GST_BUFFER_SIZE(priv->sps_data) +
1562 GST_BUFFER_SIZE(priv->pps_data) + 32)*8);
1565 h264_bitstream_write_uint(&bitstream, configuration_version, 8);
1566 h264_bitstream_write_uint(&bitstream, profile, 8);
1567 h264_bitstream_write_uint(&bitstream, profile_comp, 8);
1568 h264_bitstream_write_uint(&bitstream, level_idc, 8);
1569 h264_bitstream_write_uint(&bitstream, h264_bit_mask[6], 6); /*111111*/
1570 h264_bitstream_write_uint(&bitstream, length_size_minus_one, 2);
1571 h264_bitstream_write_uint(&bitstream, h264_bit_mask[3], 3); /*111*/
1574 h264_bitstream_write_uint(&bitstream, 1, 5); /* sps count = 1*/
1575 ENCODER_ASSERT( BIT_STREAM_BIT_SIZE(&bitstream)%8 == 0);
1576 h264_bitstream_write_uint(&bitstream, GST_BUFFER_SIZE(priv->sps_data), 16);
1577 h264_bitstream_write_byte_array(&bitstream,
1578 GST_BUFFER_DATA(priv->sps_data),
1579 GST_BUFFER_SIZE(priv->sps_data));
1582 h264_bitstream_write_uint(&bitstream, 1, 8); /*pps count = 1*/
1583 h264_bitstream_write_uint(&bitstream, GST_BUFFER_SIZE(priv->pps_data), 16);
1584 h264_bitstream_write_byte_array(&bitstream,
1585 GST_BUFFER_DATA(priv->pps_data),
1586 GST_BUFFER_SIZE(priv->pps_data));
1588 avc_codec = gst_buffer_new();
1589 GST_BUFFER_MALLOCDATA(avc_codec) =
1590 GST_BUFFER_DATA(avc_codec) =
1591 BIT_STREAM_BUFFER(&bitstream);
1592 GST_BUFFER_SIZE(avc_codec) = BIT_STREAM_BIT_SIZE(&bitstream)/8;
1593 h264_bitstream_destroy(&bitstream, FALSE);
1594 *buffer = avc_codec;
1596 return ENCODER_NO_ERROR;
1599 static EncoderStatus
1600 gst_vaapi_encoder_h264_get_codec_data(
1601 GstVaapiEncoder* base,
1604 GstVaapiEncoderH264 *encoder = GST_VAAPI_ENCODER_H264_CAST(base);
1605 GstVaapiEncoderH264Private *priv = encoder->priv;
1608 return gst_vaapi_encoder_h264_get_avcC_codec_data(encoder, buffer);
1609 return ENCODER_NO_DATA;
1613 gst_vaapi_encoder_h264_init(GstVaapiEncoderH264 *encoder)
1615 GstVaapiEncoderH264Private *priv = GST_VAAPI_ENCODER_H264_GET_PRIVATE(encoder);
1616 ENCODER_ASSERT(priv);
1617 priv->public = encoder;
1618 encoder->priv = priv;
1620 /* init public attributes */
1621 gst_vaapi_encoder_h264_init_public_values(encoder);
1622 gst_vaapi_base_encoder_set_frame_notify(GST_VAAPI_BASE_ENCODER(encoder), TRUE);
1624 /* init private values*/
1625 priv->format = GST_MAKE_FOURCC('N','V','1','2');
1626 priv->avc_flag = FALSE;
1628 priv->ref_surface1 = NULL;
1629 priv->ref_surface2 = NULL;
1630 priv->recon_surface = NULL;
1632 priv->seq_param_id = VA_INVALID_ID;
1633 priv->pic_param_id = VA_INVALID_ID;
1634 priv->slice_param_id = VA_INVALID_ID;
1635 priv->misc_param_hdr_id = VA_INVALID_ID;
1636 priv->packed_seq_param_id = VA_INVALID_ID;
1637 priv->packed_seq_data_id = VA_INVALID_ID;
1638 priv->packed_pic_param_id = VA_INVALID_ID;
1639 priv->packed_pic_data_id = VA_INVALID_ID;
1640 priv->is_seq_param_set = FALSE;
1641 priv->slice_param_buffers = NULL;
1642 priv->default_slice_height = 0;
1643 priv->slice_mod_mb_num = 0;
1645 priv->sps_data = NULL;
1646 priv->pps_data = NULL;
1648 priv->queued_buffers = g_queue_new();
1649 priv->gop_count = 0;
1650 priv->cur_display_num = 0;
1651 priv->cur_decode_num = 0;
1652 priv->cur_slice_type = SLICE_TYPE_I;
1653 priv->last_decode_time = 0LL;
1654 priv->default_cts_offset = 0;
1656 priv->max_frame_num = 0;
1657 priv->max_pic_order_cnt = 0;
1662 gst_vaapi_encoder_h264_finalize(GObject *object)
1664 /*free private buffers*/
1665 GstVaapiEncoder *encoder = GST_VAAPI_ENCODER(object);
1666 GstVaapiEncoderH264Private *priv = GST_VAAPI_ENCODER_H264_GET_PRIVATE(object);
1668 if (gst_vaapi_encoder_get_state(encoder) != VAAPI_ENC_NULL) {
1669 gst_vaapi_encoder_uninitialize(encoder);
1672 if (priv->sps_data) {
1673 gst_buffer_unref(priv->sps_data);
1674 priv->sps_data = NULL;
1676 if (priv->pps_data) {
1677 gst_buffer_unref(priv->pps_data);
1678 priv->pps_data = NULL;
1680 if (priv->slice_param_buffers) {
1681 g_free(priv->slice_param_buffers);
1682 priv->slice_param_buffers = NULL;
1685 if (priv->queued_buffers) {
1686 ENCODER_ASSERT(g_queue_is_empty(priv->queued_buffers));
1687 g_queue_free(priv->queued_buffers);
1688 priv->queued_buffers = NULL;
1691 G_OBJECT_CLASS(gst_vaapi_encoder_h264_parent_class)->finalize(object);
1695 gst_vaapi_encoder_h264_class_init(GstVaapiEncoderH264Class *klass)
1697 GObjectClass * const object_class = G_OBJECT_CLASS(klass);
1698 GstVaapiEncoderClass * const encoder_class = GST_VAAPI_ENCODER_CLASS(klass);
1699 GstVaapiBaseEncoderClass * const base_class = GST_VAAPI_BASE_ENCODER_CLASS(klass);
1701 g_type_class_add_private(klass, sizeof(GstVaapiEncoderH264Private));
1703 GST_DEBUG_CATEGORY_INIT (gst_vaapi_h264_encoder_debug,
1704 "gst_va_h264_encoder",
1706 "gst_va_h264_encoder element");
1708 object_class->finalize = gst_vaapi_encoder_h264_finalize;
1710 base_class->validate_attributes = gst_vaapi_encoder_h264_validate_attributes;
1711 base_class->pre_alloc_resource = gst_vaapi_encoder_h264_alloc_slices;
1712 base_class->release_resource = gst_vaapi_encoder_h264_release_resource;
1713 base_class->prepare_next_input_buffer =
1714 gst_vaapi_encoder_h264_prepare_next_buffer;
1715 base_class->render_frame = gst_vaapi_encoder_h264_rendering;
1716 base_class->notify_buffer = gst_vaapi_encoder_h264_notify_frame;
1717 base_class->wrap_buffer = gst_vaapi_encoder_h264_wrap_buffer;
1718 base_class->encode_frame_failed = gst_vaapi_encoder_h264_frame_failed;
1720 encoder_class->flush = gst_vaapi_encoder_h264_flush;
1721 encoder_class->get_codec_data = gst_vaapi_encoder_h264_get_codec_data;
1725 h264_bitstream_init(H264Bitstream *bitstream, guint32 bit_capability)
1727 bitstream->bit_size = 0;
1728 bitstream->buffer = NULL;
1729 bitstream->max_bit_capability = 0;
1730 if (bit_capability) {
1731 h264_bitstream_auto_grow(bitstream, bit_capability);
1736 h264_bitstream_write_uint(
1737 H264Bitstream *bitstream,
1742 gboolean ret = TRUE;
1743 guint32 byte_pos, bit_offset;
1751 VAAPI_UNUSED_ARG(ret);
1752 ENCODER_CHECK_STATUS(h264_bitstream_auto_grow(bitstream, bit_size),
1754 "h264_bitstream_auto_grow failed.");
1755 byte_pos = (bitstream->bit_size>>3);
1756 bit_offset = (bitstream->bit_size&0x07);
1757 cur_byte = bitstream->buffer + byte_pos;
1758 ENCODER_ASSERT(bit_offset < 8 &&
1759 bitstream->bit_size <= bitstream->max_bit_capability);
1762 fill_bits = ((8-bit_offset) < bit_size ? (8-bit_offset) : bit_size);
1763 bit_size -= fill_bits;
1764 bitstream->bit_size += fill_bits;
1767 ((value>>bit_size) & h264_bit_mask[fill_bits])<<(8-bit_offset-fill_bits);
1771 ENCODER_ASSERT(cur_byte <=
1772 (bitstream->buffer + bitstream->max_bit_capability/8));
1779 h264_bitstream_align(H264Bitstream *bitstream, guint32 value)
1781 guint32 bit_offset, bit_left;
1783 bit_offset = (bitstream->bit_size&0x07);
1787 bit_left = 8 - bit_offset;
1788 if (value) value = h264_bit_mask[bit_left];
1789 return h264_bitstream_write_uint(bitstream, value, bit_left);
1794 h264_bitstream_write_byte_array(
1795 H264Bitstream *bitstream,
1800 gboolean ret = TRUE;
1805 VAAPI_UNUSED_ARG(ret);
1806 ENCODER_CHECK_STATUS(h264_bitstream_auto_grow(bitstream, byte_size<<3),
1808 "h264_bitstream_auto_grow failed.");
1809 if (0 == (bitstream->bit_size&0x07)) {
1810 memcpy(&bitstream->buffer[bitstream->bit_size>>3], buf, byte_size);
1811 bitstream->bit_size += (byte_size<<3);
1815 h264_bitstream_write_uint(bitstream, *buf, 8);
1826 h264_bitstream_write_ue(H264Bitstream *bitstream, guint32 value)
1828 gboolean ret = TRUE;
1829 guint32 size_in_bits = 0;
1830 guint32 tmp_value = ++value;
1835 ENCODER_CHECK_STATUS(h264_bitstream_write_uint(bitstream, 0, size_in_bits-1),
1837 "h264_bitstream_write_ue failed.");
1838 ENCODER_CHECK_STATUS(h264_bitstream_write_uint(bitstream, value, size_in_bits),
1840 "h264_bitstream_write_ue failed.");
1847 h264_bitstream_write_se(H264Bitstream *bitstream, gint32 value)
1849 gboolean ret = TRUE;
1853 new_val = -(value<<1);
1855 new_val = (value<<1) - 1;
1858 ENCODER_CHECK_STATUS(h264_bitstream_write_ue(bitstream, new_val),
1860 "h264_bitstream_write_se failed.");
1867 h264_bitstream_write_trailing_bits(H264Bitstream *bitstream)
1869 h264_bitstream_write_uint(bitstream, 1, 1);
1870 h264_bitstream_align(bitstream, 0);
1875 h264_bitstream_destroy(H264Bitstream *bitstream, gboolean free_flag)
1877 if (bitstream->buffer && free_flag) {
1878 free (bitstream->buffer);
1880 bitstream->buffer = NULL;
1881 bitstream->bit_size = 0;
1882 bitstream->max_bit_capability = 0;
1886 h264_bitstream_auto_grow(H264Bitstream *bitstream, guint32 extra_bit_size)
1888 guint32 new_bit_size = extra_bit_size + bitstream->bit_size;
1891 ENCODER_ASSERT(bitstream->bit_size <= bitstream->max_bit_capability);
1892 if (new_bit_size <= bitstream->max_bit_capability) {
1896 new_bit_size = ((new_bit_size + H264_BITSTREAM_ALLOC_ALIGN_MASK)
1897 &(~H264_BITSTREAM_ALLOC_ALIGN_MASK));
1898 ENCODER_ASSERT(new_bit_size%(H264_BITSTREAM_ALLOC_ALIGN_MASK+1) == 0);
1899 clear_pos = ((bitstream->bit_size+7)>>3);
1900 bitstream->buffer = realloc(bitstream->buffer, new_bit_size>>3);
1901 memset(bitstream->buffer+clear_pos, 0, (new_bit_size>>3)-clear_pos);
1902 bitstream->max_bit_capability = new_bit_size;
1907 h264_bitstream_write_nal_header(
1908 H264Bitstream *bitstream,
1913 h264_bitstream_write_uint(bitstream, 0, 1);
1914 h264_bitstream_write_uint(bitstream, nal_ref_idc, 2);
1915 h264_bitstream_write_uint(bitstream, nal_unit_type, 5);
1919 #if !HAVE_OLD_H264_ENCODER
1922 h264_bitstream_write_sps(
1923 H264Bitstream *bitstream,
1924 VAEncSequenceParameterBufferH264 *seq,
1925 H264_Profile profile
1928 guint32 constraint_set0_flag, constraint_set1_flag;
1929 guint32 constraint_set2_flag, constraint_set3_flag;
1930 guint32 gaps_in_frame_num_value_allowed_flag = 0; // ??
1931 gboolean nal_hrd_parameters_present_flag;
1933 guint32 b_qpprime_y_zero_transform_bypass = 0;
1934 guint32 residual_color_transform_flag = 0;
1935 guint32 pic_height_in_map_units =
1936 (seq->seq_fields.bits.frame_mbs_only_flag ?
1937 seq->picture_height_in_mbs :
1938 seq->picture_height_in_mbs/2);
1939 guint32 mb_adaptive_frame_field = !seq->seq_fields.bits.frame_mbs_only_flag;
1942 constraint_set0_flag = profile == H264_PROFILE_BASELINE;
1943 constraint_set1_flag = profile <= H264_PROFILE_MAIN;
1944 constraint_set2_flag = 0;
1945 constraint_set3_flag = 0;
1948 h264_bitstream_write_uint(bitstream, profile, 8);
1949 /* constraint_set0_flag */
1950 h264_bitstream_write_uint(bitstream, constraint_set0_flag, 1);
1951 /* constraint_set1_flag */
1952 h264_bitstream_write_uint(bitstream, constraint_set1_flag, 1);
1953 /* constraint_set2_flag */
1954 h264_bitstream_write_uint(bitstream, constraint_set2_flag, 1);
1955 /* constraint_set3_flag */
1956 h264_bitstream_write_uint(bitstream, constraint_set3_flag, 1);
1957 /* reserved_zero_4bits */
1958 h264_bitstream_write_uint(bitstream, 0, 4);
1960 h264_bitstream_write_uint(bitstream, seq->level_idc, 8);
1961 /* seq_parameter_set_id */
1962 h264_bitstream_write_ue(bitstream, seq->seq_parameter_set_id);
1964 if (profile >= H264_PROFILE_HIGH) {
1965 /* for high profile */
1967 /* chroma_format_idc = 1, 4:2:0*/
1968 h264_bitstream_write_ue(bitstream, seq->seq_fields.bits.chroma_format_idc);
1969 if (3 == seq->seq_fields.bits.chroma_format_idc) {
1970 h264_bitstream_write_uint(bitstream, residual_color_transform_flag, 1);
1972 /* bit_depth_luma_minus8 */
1973 h264_bitstream_write_ue(bitstream, seq->bit_depth_luma_minus8);
1974 /* bit_depth_chroma_minus8 */
1975 h264_bitstream_write_ue(bitstream, seq->bit_depth_chroma_minus8);
1976 /* b_qpprime_y_zero_transform_bypass */
1977 h264_bitstream_write_uint(bitstream, b_qpprime_y_zero_transform_bypass, 1);
1978 ENCODER_ASSERT(seq->seq_fields.bits.seq_scaling_matrix_present_flag == 0);
1979 /*seq_scaling_matrix_present_flag */
1980 h264_bitstream_write_uint(bitstream,
1981 seq->seq_fields.bits.seq_scaling_matrix_present_flag,
1985 if (seq->seq_fields.bits.seq_scaling_matrix_present_flag) {
1986 for (i = 0; i < (seq->seq_fields.bits.chroma_format_idc != 3 ? 8 : 12); i++) {
1987 h264_bitstream_write_uint(bitstream, seq->seq_fields.bits.seq_scaling_list_present_flag, 1);
1988 if (seq->seq_fields.bits.seq_scaling_list_present_flag) {
1990 /* FIXME, need write scaling list if seq_scaling_matrix_present_flag ==1*/
1997 /* log2_max_frame_num_minus4 */
1998 h264_bitstream_write_ue(bitstream,
1999 seq->seq_fields.bits.log2_max_frame_num_minus4);
2000 /* pic_order_cnt_type */
2001 h264_bitstream_write_ue(bitstream, seq->seq_fields.bits.pic_order_cnt_type);
2003 if (seq->seq_fields.bits.pic_order_cnt_type == 0) {
2004 /* log2_max_pic_order_cnt_lsb_minus4 */
2005 h264_bitstream_write_ue(bitstream,
2006 seq->seq_fields.bits.log2_max_pic_order_cnt_lsb_minus4);
2007 } else if (seq->seq_fields.bits.pic_order_cnt_type == 1) {
2009 h264_bitstream_write_uint(bitstream,
2010 seq->seq_fields.bits.delta_pic_order_always_zero_flag,
2012 h264_bitstream_write_se(bitstream, seq->offset_for_non_ref_pic);
2013 h264_bitstream_write_se(bitstream,
2014 seq->offset_for_top_to_bottom_field);
2015 h264_bitstream_write_ue(bitstream,
2016 seq->num_ref_frames_in_pic_order_cnt_cycle);
2017 for ( i = 0; i < seq->num_ref_frames_in_pic_order_cnt_cycle; i++) {
2018 h264_bitstream_write_se(bitstream, seq->offset_for_ref_frame[i]);
2022 /* num_ref_frames */
2023 h264_bitstream_write_ue(bitstream, seq->max_num_ref_frames);
2024 /* gaps_in_frame_num_value_allowed_flag */
2025 h264_bitstream_write_uint(bitstream,
2026 gaps_in_frame_num_value_allowed_flag,
2029 /* pic_width_in_mbs_minus1 */
2030 h264_bitstream_write_ue(bitstream, seq->picture_width_in_mbs - 1);
2031 /* pic_height_in_map_units_minus1 */
2032 h264_bitstream_write_ue(bitstream, pic_height_in_map_units - 1);
2033 /* frame_mbs_only_flag */
2034 h264_bitstream_write_uint(bitstream,
2035 seq->seq_fields.bits.frame_mbs_only_flag,
2038 if (!seq->seq_fields.bits.frame_mbs_only_flag) { //ONLY mbs
2040 h264_bitstream_write_uint(bitstream, mb_adaptive_frame_field, 1);
2043 /* direct_8x8_inference_flag */
2044 h264_bitstream_write_uint(bitstream, 0, 1);
2045 /* frame_cropping_flag */
2046 h264_bitstream_write_uint(bitstream, seq->frame_cropping_flag, 1);
2048 if (seq->frame_cropping_flag) {
2049 /* frame_crop_left_offset */
2050 h264_bitstream_write_ue(bitstream, seq->frame_crop_left_offset);
2051 /* frame_crop_right_offset */
2052 h264_bitstream_write_ue(bitstream, seq->frame_crop_right_offset);
2053 /* frame_crop_top_offset */
2054 h264_bitstream_write_ue(bitstream, seq->frame_crop_top_offset);
2055 /* frame_crop_bottom_offset */
2056 h264_bitstream_write_ue(bitstream, seq->frame_crop_bottom_offset);
2059 /* vui_parameters_present_flag */
2060 h264_bitstream_write_uint(bitstream, seq->vui_parameters_present_flag, 1);
2061 if (seq->vui_parameters_present_flag) {
2062 /* aspect_ratio_info_present_flag */
2063 h264_bitstream_write_uint(bitstream,
2064 seq->vui_fields.bits.aspect_ratio_info_present_flag,
2066 if (seq->vui_fields.bits.aspect_ratio_info_present_flag) {
2067 h264_bitstream_write_uint(bitstream, seq->aspect_ratio_idc, 8);
2068 if (seq->aspect_ratio_idc == 0xFF) {
2069 h264_bitstream_write_uint(bitstream, seq->sar_width, 16);
2070 h264_bitstream_write_uint(bitstream, seq->sar_height, 16);
2074 /* overscan_info_present_flag */
2075 h264_bitstream_write_uint(bitstream, 0, 1);
2076 /* video_signal_type_present_flag */
2077 h264_bitstream_write_uint(bitstream, 0, 1);
2078 /* chroma_loc_info_present_flag */
2079 h264_bitstream_write_uint(bitstream, 0, 1);
2081 /* timing_info_present_flag */
2082 h264_bitstream_write_uint(bitstream,
2083 seq->vui_fields.bits.timing_info_present_flag,
2085 if (seq->vui_fields.bits.timing_info_present_flag) {
2086 h264_bitstream_write_uint(bitstream, seq->num_units_in_tick, 32);
2087 h264_bitstream_write_uint(bitstream, seq->time_scale, 32);
2088 h264_bitstream_write_uint(bitstream, 1, 1); /* fixed_frame_rate_flag */
2091 nal_hrd_parameters_present_flag = (seq->bits_per_second > 0 ? TRUE : FALSE);
2092 /* nal_hrd_parameters_present_flag */
2093 h264_bitstream_write_uint(bitstream, nal_hrd_parameters_present_flag, 1);
2094 if (nal_hrd_parameters_present_flag) {
2095 /* hrd_parameters */
2096 /* cpb_cnt_minus1 */
2097 h264_bitstream_write_ue(bitstream, 0);
2098 h264_bitstream_write_uint(bitstream, 4, 4); /* bit_rate_scale */
2099 h264_bitstream_write_uint(bitstream, 6, 4); /* cpb_size_scale */
2101 for (i = 0; i < 1; ++i) {
2102 /* bit_rate_value_minus1[0] */
2103 h264_bitstream_write_ue(bitstream, seq->bits_per_second/1024- 1);
2104 /* cpb_size_value_minus1[0] */
2105 h264_bitstream_write_ue(bitstream, seq->bits_per_second/1024*8 - 1);
2107 h264_bitstream_write_uint(bitstream, 1, 1);
2109 /* initial_cpb_removal_delay_length_minus1 */
2110 h264_bitstream_write_uint(bitstream, 23, 5);
2111 /* cpb_removal_delay_length_minus1 */
2112 h264_bitstream_write_uint(bitstream, 23, 5);
2113 /* dpb_output_delay_length_minus1 */
2114 h264_bitstream_write_uint(bitstream, 23, 5);
2115 /* time_offset_length */
2116 h264_bitstream_write_uint(bitstream, 23, 5);
2118 /* vcl_hrd_parameters_present_flag */
2119 h264_bitstream_write_uint(bitstream, 0, 1);
2120 if (nal_hrd_parameters_present_flag || 0/*vcl_hrd_parameters_present_flag*/) {
2121 /* low_delay_hrd_flag */
2122 h264_bitstream_write_uint(bitstream, 0, 1);
2124 /* pic_struct_present_flag */
2125 h264_bitstream_write_uint(bitstream, 0, 1);
2126 /* bitstream_restriction_flag */
2127 h264_bitstream_write_uint(bitstream, 0, 1);
2129 /* rbsp_trailing_bits */
2130 h264_bitstream_write_trailing_bits(bitstream);
2135 h264_bitstream_write_pps(
2136 H264Bitstream *bitstream,
2137 VAEncPictureParameterBufferH264 *pic
2140 guint32 num_slice_groups_minus1 = 0;
2141 guint32 pic_init_qs_minus26 = 0;
2142 guint32 redundant_pic_cnt_present_flag = 0;
2144 /* pic_parameter_set_id */
2145 h264_bitstream_write_ue(bitstream, pic->pic_parameter_set_id);
2146 /* seq_parameter_set_id */
2147 h264_bitstream_write_ue(bitstream, pic->seq_parameter_set_id);
2148 /* entropy_coding_mode_flag */
2149 h264_bitstream_write_uint(bitstream,
2150 pic->pic_fields.bits.entropy_coding_mode_flag,
2152 /* pic_order_present_flag */
2153 h264_bitstream_write_uint(bitstream,
2154 pic->pic_fields.bits.pic_order_present_flag,
2157 h264_bitstream_write_ue(bitstream, num_slice_groups_minus1);
2159 if (num_slice_groups_minus1 > 0) {
2163 h264_bitstream_write_ue(bitstream, pic->num_ref_idx_l0_active_minus1);
2164 h264_bitstream_write_ue(bitstream, pic->num_ref_idx_l1_active_minus1);
2165 h264_bitstream_write_uint(bitstream,
2166 pic->pic_fields.bits.weighted_pred_flag,
2168 h264_bitstream_write_uint(bitstream,
2169 pic->pic_fields.bits.weighted_bipred_idc,
2171 /* pic_init_qp_minus26 */
2172 h264_bitstream_write_se(bitstream, pic->pic_init_qp-26);
2173 /* pic_init_qs_minus26 */
2174 h264_bitstream_write_se(bitstream, pic_init_qs_minus26);
2175 /*chroma_qp_index_offset*/
2176 h264_bitstream_write_se(bitstream, pic->chroma_qp_index_offset);
2178 h264_bitstream_write_uint(bitstream,
2179 pic->pic_fields.bits.deblocking_filter_control_present_flag,
2181 h264_bitstream_write_uint(bitstream,
2182 pic->pic_fields.bits.constrained_intra_pred_flag,
2184 h264_bitstream_write_uint(bitstream, redundant_pic_cnt_present_flag, 1);
2187 h264_bitstream_write_uint(bitstream,
2188 pic->pic_fields.bits.transform_8x8_mode_flag,
2190 h264_bitstream_write_uint(bitstream,
2191 pic->pic_fields.bits.pic_scaling_matrix_present_flag,
2193 if (pic->pic_fields.bits.pic_scaling_matrix_present_flag) {
2198 (6+(-( (chroma_format_idc ! = 3) ? 2 : 6) * -pic->pic_fields.bits.transform_8x8_mode_flag));
2200 h264_bitstream_write_uint(bitstream, pic->pic_fields.bits.pic_scaling_list_present_flag, 1);
2205 h264_bitstream_write_se(bitstream, pic->second_chroma_qp_index_offset);
2206 h264_bitstream_write_trailing_bits(bitstream);