return success;
}
+
+gboolean
+gst_vaapi_convert_buffer_to_image(
+ GstVaapiImage *image,
+ GstBuffer *inbuf) // inbuf : I420
+{
+ GstVaapiImagePrivate *priv;
+ guint width, height;
+ guint row, column;
+ GstVaapiImageFormat format;
+ guint8 *y_src, *u_src, *v_src;
+ guint8 *y_dest, *u_dest, *v_dest;
+
+ priv = image->priv;
+ gst_vaapi_image_get_size(image, &width, &height);
+ format = gst_vaapi_image_get_format(image);
+ gst_vaapi_image_map(image);
+
+ y_src = GST_BUFFER_DATA(inbuf);
+ u_src = y_src + width*height;
+ v_src = u_src + (width/2)*(height/2);
+
+ y_dest = priv->image_data + priv->image.offsets[0];
+ u_dest = priv->image_data + priv->image.offsets[1];
+ v_dest = priv->image_data + priv->image.offsets[2];
+
+ if (format == GST_VAAPI_IMAGE_NV12) {
+ for (row = 0; row < height; row++) {
+ memcpy(y_dest, y_src, width);
+ y_src += width;
+ y_dest += priv->image.pitches[0];
+ }
+ for (row = 0; row < height/2; row++) {
+ for (column = 0; column < width/2; column++) {
+ u_dest[column*2] = u_src[column];
+ u_dest[column*2+1] = v_src[column];
+ }
+ u_src += width/2;
+ v_src += width/2;
+ u_dest += priv->image.pitches[1];
+ }
+ }
+ gst_vaapi_image_unmap(image);
+ return TRUE;
+}
+
GstVaapiRectangle *rect
);
+gboolean
+gst_vaapi_convert_buffer_to_image(GstVaapiImage *image, GstBuffer *buffer);
+
+
G_END_DECLS
#endif /* GST_VAAPI_IMAGE_H */
if (!gst_vaapiupload_ensure_surface_pool(upload, outcaps))
return FALSE;
- gst_vaapiupload_ensure_direct_rendering_caps(upload, incaps);
+ if (convert->direct_rendering)
+ gst_vaapiupload_ensure_direct_rendering_caps(upload, incaps);
dr = MIN(upload->direct_rendering, upload->direct_rendering_caps);
if (upload->direct_rendering != dr) {
upload->direct_rendering = dr;
- GST_DEBUG("direct-rendering level: %d", dr);
- }
return TRUE;
}
GST_BUFFER_TIMESTAMP(video_buffer) = GST_BUFFER_TIMESTAMP(raw_pic);
GST_BUFFER_DURATION(video_buffer) = GST_BUFFER_DURATION(raw_pic);
}
- }else {
+ } else {
base_prv->need_flush = TRUE;
}
VASurfaceID surface_id = (VASurfaceID)GST_VAAPI_OBJECT_ID(buffer_surface);
VADisplay va_dpy = gst_vaapi_display_get_display(display);
- ENCODER_ASSERT(coded_pics && *coded_pics == NULL);
+ ENCODER_ASSERT(coded_pics);
VAAPI_UNUSED_ARG(has_coded_data);
/* lock display */
H264_PROP_INIT_QP,
H264_PROP_MIN_QP,
H264_PROP_SLICE_NUM,
+ H264_PROP_B_FRAME_NUM,
};
200,
1,
G_PARAM_READWRITE));
+ g_object_class_install_property (object_class, H264_PROP_B_FRAME_NUM,
+ g_param_spec_uint ("b-frame-num",
+ "B frams num",
+ "B frams num",
+ 0,
+ 10,
+ 0,
+ G_PARAM_READWRITE));
}
}
break;
+ case H264_PROP_B_FRAME_NUM: {
+ h264encoder->b_frame_num= g_value_get_uint(value);
+ }
+ break;
+
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
g_value_set_uint (value, h264encoder->slice_num);
break;
+ case H264_PROP_B_FRAME_NUM:
+ g_value_set_uint (value, h264encoder->b_frame_num);
+ break;
+
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
GstH264EncoderPrivate *h264_prv = GST_H264_ENCODER_GET_PRIVATE(h264_encoder);
GstVaapiVideoBuffer *return_buf = NULL;
GstVaapiVideoBuffer *tmp_next_buf = NULL;
- guint64 pts = 0;
- guint32 cts = 0;
+ //guint64 pts = 0;
if (NULL == display_buf && g_queue_is_empty(h264_prv->queued_buffers)) {
ret = ENCODER_BUFFER_EMPTY;
end:
*out_buf = return_buf;
/* calculate cts/pts/dts */
+#if 0
if (return_buf) {
pts = GST_BUFFER_TIMESTAMP(return_buf);
tmp_next_buf = (GstVaapiVideoBuffer*)g_queue_peek_head(h264_prv->queued_buffers);
} else if (SLICE_TYPE_B == h264_prv->cur_slice_type) {
GST_BUFFER_TIMESTAMP(return_buf) = h264_prv->last_decode_time;
}
- cts = (pts + h264_prv->default_cts_offset - GST_BUFFER_TIMESTAMP(return_buf));
- ENCODER_ASSERT(cts < 0x80000000);
- if (cts > 0x80000000) {
- cts = 0;
+
+ pts += h264_prv->default_cts_offset;
+ if ((gint64)(pts - GST_BUFFER_TIMESTAMP(return_buf)) < 0) {
+ pts = GST_BUFFER_TIMESTAMP(return_buf);
}
- GST_BUFFER_OFFSET_END(return_buf) = cts;
+
+ GST_BUFFER_OFFSET_END(return_buf) = pts;
+ GST_BUFFER_TIMESTAMP(return_buf) = pts;
}
+#endif
+
return ret;
}
pic_h264.pic_fields.bits.transform_8x8_mode_flag = 1;
pic_h264.pic_fields.bits.deblocking_filter_control_present_flag = 1;
+ char *frame_type = "I";
+ if (h264_prv->cur_slice_type == SLICE_TYPE_P)
+ frame_type = "P";
+ if (h264_prv->cur_slice_type == SLICE_TYPE_B)
+ frame_type = "B";
+ ENCODER_LOG_INFO("type:%s, frame_num:%d, display_num:%d\n",
+ frame_type, pic_h264.frame_num, pic_h264.CurrPic.TopFieldOrderCnt);
+
if (VA_INVALID_ID != h264_prv->pic_parameter) { /* share the same pic_parameter*/
vaDestroyBuffer(va_dpy, h264_prv->pic_parameter);
h264_prv->pic_parameter = VA_INVALID_ID;