mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-17 11:45:25 +00:00
x264enc: Add support for Y444, Y42B and NV12
This commit is contained in:
parent
c4335cf663
commit
d098eb0941
1 changed files with 42 additions and 5 deletions
|
@ -393,7 +393,7 @@ static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink",
|
||||||
GST_PAD_SINK,
|
GST_PAD_SINK,
|
||||||
GST_PAD_ALWAYS,
|
GST_PAD_ALWAYS,
|
||||||
GST_STATIC_CAPS ("video/x-raw, "
|
GST_STATIC_CAPS ("video/x-raw, "
|
||||||
"format = (string) { I420, YV12 }, "
|
"format = (string) { I420, YV12, Y42B, Y444, NV12 }, "
|
||||||
"framerate = (fraction) [0, MAX], "
|
"framerate = (fraction) [0, MAX], "
|
||||||
"width = (int) [ 16, MAX ], " "height = (int) [ 16, MAX ]")
|
"width = (int) [ 16, MAX ], " "height = (int) [ 16, MAX ]")
|
||||||
);
|
);
|
||||||
|
@ -974,6 +974,38 @@ gst_x264_enc_parse_options (GstX264Enc * encoder, const gchar * str)
|
||||||
return !ret;
|
return !ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gint
|
||||||
|
gst_x264_enc_gst_to_x264_video_format (GstVideoFormat format, gint * nplanes)
|
||||||
|
{
|
||||||
|
switch (format) {
|
||||||
|
case GST_VIDEO_FORMAT_I420:
|
||||||
|
case GST_VIDEO_FORMAT_YV12:
|
||||||
|
if (nplanes)
|
||||||
|
*nplanes = 3;
|
||||||
|
return X264_CSP_I420;
|
||||||
|
break;
|
||||||
|
case GST_VIDEO_FORMAT_Y42B:
|
||||||
|
if (nplanes)
|
||||||
|
*nplanes = 3;
|
||||||
|
return X264_CSP_I422;
|
||||||
|
break;
|
||||||
|
case GST_VIDEO_FORMAT_Y444:
|
||||||
|
if (nplanes)
|
||||||
|
*nplanes = 3;
|
||||||
|
return X264_CSP_I444;
|
||||||
|
break;
|
||||||
|
case GST_VIDEO_FORMAT_NV12:
|
||||||
|
if (nplanes)
|
||||||
|
*nplanes = 2;
|
||||||
|
return X264_CSP_NV12;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
g_assert_not_reached ();
|
||||||
|
return GST_VIDEO_FORMAT_UNKNOWN;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* gst_x264_enc_init_encoder
|
* gst_x264_enc_init_encoder
|
||||||
* @encoder: Encoder which should be initialized.
|
* @encoder: Encoder which should be initialized.
|
||||||
|
@ -1052,6 +1084,8 @@ gst_x264_enc_init_encoder (GstX264Enc * encoder)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* set up encoder parameters */
|
/* set up encoder parameters */
|
||||||
|
encoder->x264param.i_csp =
|
||||||
|
gst_x264_enc_gst_to_x264_video_format (info->finfo->format, NULL);
|
||||||
encoder->x264param.i_fps_num = info->fps_n;
|
encoder->x264param.i_fps_num = info->fps_n;
|
||||||
encoder->x264param.i_fps_den = info->fps_d;
|
encoder->x264param.i_fps_den = info->fps_d;
|
||||||
encoder->x264param.i_width = info->width;
|
encoder->x264param.i_width = info->width;
|
||||||
|
@ -1415,7 +1449,8 @@ gst_x264_enc_set_format (GstVideoEncoder * video_enc,
|
||||||
if (encoder->x264enc) {
|
if (encoder->x264enc) {
|
||||||
GstVideoInfo *old = &encoder->input_state->info;
|
GstVideoInfo *old = &encoder->input_state->info;
|
||||||
|
|
||||||
if (info->width == old->width && info->height == old->height
|
if (info->finfo->format == old->finfo->format
|
||||||
|
&& info->width == old->width && info->height == old->height
|
||||||
&& info->fps_n == old->fps_n && info->fps_d == old->fps_d
|
&& info->fps_n == old->fps_n && info->fps_d == old->fps_d
|
||||||
&& info->par_n == old->par_n && info->par_d == old->par_d) {
|
&& info->par_n == old->par_n && info->par_d == old->par_d) {
|
||||||
gst_video_codec_state_unref (encoder->input_state);
|
gst_video_codec_state_unref (encoder->input_state);
|
||||||
|
@ -1575,6 +1610,7 @@ gst_x264_enc_handle_frame (GstVideoEncoder * video_enc,
|
||||||
x264_picture_t pic_in;
|
x264_picture_t pic_in;
|
||||||
gint i_nal, i;
|
gint i_nal, i;
|
||||||
FrameData *fdata;
|
FrameData *fdata;
|
||||||
|
gint nplanes;
|
||||||
|
|
||||||
if (G_UNLIKELY (encoder->x264enc == NULL))
|
if (G_UNLIKELY (encoder->x264enc == NULL))
|
||||||
goto not_inited;
|
goto not_inited;
|
||||||
|
@ -1589,9 +1625,10 @@ gst_x264_enc_handle_frame (GstVideoEncoder * video_enc,
|
||||||
if (!fdata)
|
if (!fdata)
|
||||||
goto invalid_frame;
|
goto invalid_frame;
|
||||||
|
|
||||||
pic_in.img.i_csp = X264_CSP_I420;
|
pic_in.img.i_csp =
|
||||||
pic_in.img.i_plane = 3;
|
gst_x264_enc_gst_to_x264_video_format (info->finfo->format, &nplanes);
|
||||||
for (i = 0; i < 3; i++) {
|
pic_in.img.i_plane = nplanes;
|
||||||
|
for (i = 0; i < nplanes; i++) {
|
||||||
pic_in.img.plane[i] = GST_VIDEO_FRAME_PLANE_DATA (&fdata->vframe, i);
|
pic_in.img.plane[i] = GST_VIDEO_FRAME_PLANE_DATA (&fdata->vframe, i);
|
||||||
pic_in.img.i_stride[i] = GST_VIDEO_FRAME_COMP_STRIDE (&fdata->vframe, i);
|
pic_in.img.i_stride[i] = GST_VIDEO_FRAME_COMP_STRIDE (&fdata->vframe, i);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue