static GstVaapiEncoderStatus set_context_info (GstVaapiEncoder * base_encoder) { GstVaapiEncoderJpeg *encoder = GST_VAAPI_ENCODER_JPEG_CAST (base_encoder); GstVideoInfo *const vip = GST_VAAPI_ENCODER_VIDEO_INFO (encoder); /* Maximum sizes for common headers (in bytes) */ enum { MAX_APP_HDR_SIZE = 20, MAX_FRAME_HDR_SIZE = 19, MAX_QUANT_TABLE_SIZE = 138, MAX_HUFFMAN_TABLE_SIZE = 432, MAX_SCAN_HDR_SIZE = 14 }; if (!ensure_hw_profile (encoder)) return GST_VAAPI_ENCODER_STATUS_ERROR_UNSUPPORTED_PROFILE; base_encoder->num_ref_frames = 0; /* Only YUV 4:2:0 formats are supported for now. */ base_encoder->codedbuf_size = GST_ROUND_UP_16 (vip->width) * GST_ROUND_UP_16 (vip->height) * 3 / 2; base_encoder->codedbuf_size += MAX_APP_HDR_SIZE + MAX_FRAME_HDR_SIZE + MAX_QUANT_TABLE_SIZE + MAX_HUFFMAN_TABLE_SIZE + MAX_SCAN_HDR_SIZE; return GST_VAAPI_ENCODER_STATUS_SUCCESS; }
static GstVaapiEncoderStatus set_context_info (GstVaapiEncoder * base_encoder) { GstVaapiEncoderMpeg2 *const encoder = GST_VAAPI_ENCODER_MPEG2_CAST (base_encoder); GstVideoInfo *const vip = GST_VAAPI_ENCODER_VIDEO_INFO (encoder); /* Maximum sizes for common headers (in bytes) */ enum { MAX_SEQ_HDR_SIZE = 140, MAX_SEQ_EXT_SIZE = 10, MAX_GOP_SIZE = 8, MAX_PIC_HDR_SIZE = 10, MAX_PIC_EXT_SIZE = 11, MAX_SLICE_HDR_SIZE = 8, }; if (!ensure_hw_profile (encoder)) return GST_VAAPI_ENCODER_STATUS_ERROR_UNSUPPORTED_PROFILE; base_encoder->num_ref_frames = 2; /* Only YUV 4:2:0 formats are supported for now. This means that we have a limit of 4608 bits per macroblock. */ base_encoder->codedbuf_size = (GST_ROUND_UP_16 (vip->width) * GST_ROUND_UP_16 (vip->height) / 256) * 576; /* Account for Sequence, GOP, and Picture headers */ /* XXX: exclude unused Sequence Display Extension, Sequence Scalable Extension, Quantization Matrix Extension, Picture Display Extension, Picture Temporal Scalable Extension, Picture Spatial Scalable Extension */ base_encoder->codedbuf_size += MAX_SEQ_HDR_SIZE + MAX_SEQ_EXT_SIZE + MAX_GOP_SIZE + MAX_PIC_HDR_SIZE + MAX_PIC_EXT_SIZE; /* Account for Slice headers. We use one slice per line of macroblock */ base_encoder->codedbuf_size += (GST_ROUND_UP_16 (vip->height) / 16) * MAX_SLICE_HDR_SIZE; return GST_VAAPI_ENCODER_STATUS_SUCCESS; }
static GstVaapiEncoderStatus set_context_info (GstVaapiEncoder * base_encoder) { GstVaapiEncoderVP8 *encoder = GST_VAAPI_ENCODER_VP8_CAST (base_encoder); GstVideoInfo *const vip = GST_VAAPI_ENCODER_VIDEO_INFO (encoder); /* Maximum sizes for common headers (in bytes) */ enum { MAX_FRAME_TAG_SIZE = 10, MAX_UPDATE_SEGMENTATION_SIZE = 13, MAX_MB_LF_ADJUSTMENTS_SIZE = 9, MAX_QUANT_INDICES_SIZE = 5, MAX_TOKEN_PROB_UPDATE_SIZE = 1188, MAX_MV_PROBE_UPDATE_SIZE = 38, MAX_REST_OF_FRAME_HDR_SIZE = 15 }; if (!ensure_hw_profile (encoder)) return GST_VAAPI_ENCODER_STATUS_ERROR_UNSUPPORTED_PROFILE; base_encoder->num_ref_frames = 3; /* Only YUV 4:2:0 formats are supported for now. */ /* Assumig 4 times compression ratio */ base_encoder->codedbuf_size = GST_ROUND_UP_16 (vip->width) * GST_ROUND_UP_16 (vip->height) * 12 / 4; base_encoder->codedbuf_size += MAX_FRAME_TAG_SIZE + MAX_UPDATE_SEGMENTATION_SIZE + MAX_MB_LF_ADJUSTMENTS_SIZE + MAX_QUANT_INDICES_SIZE + MAX_TOKEN_PROB_UPDATE_SIZE + MAX_MV_PROBE_UPDATE_SIZE + MAX_REST_OF_FRAME_HDR_SIZE; return GST_VAAPI_ENCODER_STATUS_SUCCESS; }