+gboolean
+gst_h264_validate_parameters(GstH264Encoder *encoder)
+{
+ GstH264EncoderPrivate *h264_prv = ENCPRV(encoder);
+ if (!encoder->width || !encoder->height || !encoder->frame_rate) {
+ return FALSE;
+ }
+ if (!encoder->profile) {
+ encoder->profile = H264_DEFAULT_PROFILE;
+ }
+ if (!encoder->level) {
+ encoder->level = H264_DEFAULT_LEVEL;
+ }
+ if (!encoder->intra_period) {
+ encoder->intra_period = H264_DEFAULT_INTRA_PERIOD;
+ }
+ if (-1 == encoder->init_qp) {
+ encoder->init_qp = H264_DEFAULT_INIT_QP;
+ }
+ if (-1 == encoder->min_qp) {
+ encoder->min_qp = H264_DEFAULT_MIN_QP;
+ }
+
+ if (encoder->min_qp > encoder->init_qp) {
+ encoder->min_qp = encoder->init_qp;
+ }
+
+ /* default compress ratio 1: (4*8*1.5) */
+ if (!encoder->bitrate) {
+ encoder->bitrate = encoder->width*encoder->height*encoder->frame_rate/4;
+ }
+
+ if (!encoder->slice_num) {
+ encoder->slice_num = H264_DEFAULT_SLICE_NUM;
+ }
+
+ /* need calculate slice-num and each slice-height
+ suppose: ((encoder->height+15)/16) = 13, slice_num = 8
+ then: slice_1_height = 2
+ slice_2_height = 2
+ slice_3_height = 2
+ slice_4_height = 2
+ slice_5_height = 2
+ slice_6_height = 1
+ slice_7_height = 1
+ slice_8_height = 1
+ */
+ h264_prv->default_slice_height = (encoder->height+15)/16/encoder->slice_num;
+ if (0 == h264_prv->default_slice_height) { /* special value */
+ h264_prv->default_slice_height = 1;
+ h264_prv->slice_mod_mb_num = 0;
+ encoder->slice_num = (encoder->height+15)/16;
+ } else {
+ h264_prv->slice_mod_mb_num = ((encoder->height+15)/16)%encoder->slice_num;
+ }
+ return TRUE;
+}