GstVaapiDecoder * decoder_new (GstVaapiDisplay * display, const gchar * codec_name) { GstVaapiDecoder *decoder; const CodecDefs *codec; GstCaps *caps; VideoDecodeInfo info; if (!codec_name) codec_name = "h264"; codec = find_codec_defs (codec_name); if (!codec) { GST_ERROR ("failed to find %s codec data", codec_name); return NULL; } codec->get_video_info (&info); caps = gst_vaapi_profile_get_caps (info.profile); if (!caps) { GST_ERROR ("failed to create decoder caps"); return NULL; } if (info.width > 0 && info.height > 0) gst_caps_set_simple (caps, "width", G_TYPE_INT, info.width, "height", G_TYPE_INT, info.height, NULL); switch (gst_vaapi_profile_get_codec (info.profile)) { case GST_VAAPI_CODEC_H264: decoder = gst_vaapi_decoder_h264_new (display, caps); break; #if USE_JPEG_DECODER case GST_VAAPI_CODEC_JPEG: decoder = gst_vaapi_decoder_jpeg_new (display, caps); break; #endif case GST_VAAPI_CODEC_MPEG2: decoder = gst_vaapi_decoder_mpeg2_new (display, caps); break; case GST_VAAPI_CODEC_MPEG4: decoder = gst_vaapi_decoder_mpeg4_new (display, caps); break; case GST_VAAPI_CODEC_VC1: decoder = gst_vaapi_decoder_vc1_new (display, caps); break; default: decoder = NULL; break; } gst_caps_unref (caps); if (!decoder) { GST_ERROR ("failed to create %s decoder", codec->codec_str); return NULL; } set_codec_defs (decoder, codec); return decoder; }
static gboolean gst_vaapidecode_create(GstVaapiDecode *decode, GstCaps *caps) { GstVaapiDisplay *dpy; if (!gst_vaapidecode_ensure_display(decode)) return FALSE; dpy = decode->display; decode->decoder_mutex = g_mutex_new(); if (!decode->decoder_mutex) return FALSE; decode->decoder_ready = g_cond_new(); if (!decode->decoder_ready) return FALSE; switch (gst_vaapi_codec_from_caps(caps)) { case GST_VAAPI_CODEC_MPEG2: decode->decoder = gst_vaapi_decoder_mpeg2_new(dpy, caps); break; case GST_VAAPI_CODEC_MPEG4: case GST_VAAPI_CODEC_H263: decode->decoder = gst_vaapi_decoder_mpeg4_new(dpy, caps); break; case GST_VAAPI_CODEC_H264: decode->decoder = gst_vaapi_decoder_h264_new(dpy, caps); break; case GST_VAAPI_CODEC_WMV3: case GST_VAAPI_CODEC_VC1: decode->decoder = gst_vaapi_decoder_vc1_new(dpy, caps); break; #if USE_JPEG_DECODER case GST_VAAPI_CODEC_JPEG: decode->decoder = gst_vaapi_decoder_jpeg_new(dpy, caps); break; #endif default: decode->decoder = NULL; break; } if (!decode->decoder) return FALSE; g_signal_connect( G_OBJECT(decode->decoder), "notify::caps", G_CALLBACK(gst_vaapi_decoder_notify_caps), decode ); decode->decoder_caps = gst_caps_ref(caps); return TRUE; }
static gboolean start_decoder (App * app) { GstCaps *caps; app->file = g_mapped_file_new (app->file_name, FALSE, NULL); if (!app->file) return FALSE; app->file_size = g_mapped_file_get_length (app->file); app->file_data = (guint8 *) g_mapped_file_get_contents (app->file); if (!app->file_data) return FALSE; caps = caps_from_codec (app->codec); switch (app->codec) { case GST_VAAPI_CODEC_H264: app->decoder = gst_vaapi_decoder_h264_new (app->display, caps); break; #if USE_JPEG_DECODER case GST_VAAPI_CODEC_JPEG: app->decoder = gst_vaapi_decoder_jpeg_new (app->display, caps); break; #endif case GST_VAAPI_CODEC_MPEG2: app->decoder = gst_vaapi_decoder_mpeg2_new (app->display, caps); break; case GST_VAAPI_CODEC_MPEG4: app->decoder = gst_vaapi_decoder_mpeg4_new (app->display, caps); break; case GST_VAAPI_CODEC_VC1: app->decoder = gst_vaapi_decoder_vc1_new (app->display, caps); break; default: app->decoder = NULL; break; } if (!app->decoder) return FALSE; gst_vaapi_decoder_set_codec_state_changed_func (app->decoder, handle_decoder_state_changes, app); g_timer_start (app->timer); app->decoder_thread = g_thread_try_new ("Decoder Thread", decoder_thread, app, NULL); if (!app->decoder_thread) return FALSE; return TRUE; }
static gboolean gst_vaapidecode_create (GstVaapiDecode * decode, GstCaps * caps) { GstVaapiDisplay *dpy; if (!gst_vaapidecode_ensure_display (decode)) return FALSE; dpy = GST_VAAPI_PLUGIN_BASE_DISPLAY (decode); switch (gst_vaapi_codec_from_caps (caps)) { case GST_VAAPI_CODEC_MPEG2: decode->decoder = gst_vaapi_decoder_mpeg2_new (dpy, caps); break; case GST_VAAPI_CODEC_MPEG4: case GST_VAAPI_CODEC_H263: decode->decoder = gst_vaapi_decoder_mpeg4_new (dpy, caps); break; case GST_VAAPI_CODEC_H264: decode->decoder = gst_vaapi_decoder_h264_new (dpy, caps); /* Set the stream buffer alignment for better optimizations */ if (decode->decoder && caps) { GstStructure *const structure = gst_caps_get_structure (caps, 0); const gchar *str = NULL; if ((str = gst_structure_get_string (structure, "alignment"))) { GstVaapiStreamAlignH264 alignment; if (g_strcmp0 (str, "au") == 0) alignment = GST_VAAPI_STREAM_ALIGN_H264_AU; else if (g_strcmp0 (str, "nal") == 0) alignment = GST_VAAPI_STREAM_ALIGN_H264_NALU; else alignment = GST_VAAPI_STREAM_ALIGN_H264_NONE; gst_vaapi_decoder_h264_set_alignment (GST_VAAPI_DECODER_H264 (decode->decoder), alignment); } } break; #if USE_H265_DECODER case GST_VAAPI_CODEC_H265: decode->decoder = gst_vaapi_decoder_h265_new (dpy, caps); /* Set the stream buffer alignment for better optimizations */ if (decode->decoder && caps) { GstStructure *const structure = gst_caps_get_structure (caps, 0); const gchar *str = NULL; if ((str = gst_structure_get_string (structure, "alignment"))) { GstVaapiStreamAlignH265 alignment; if (g_strcmp0 (str, "au") == 0) alignment = GST_VAAPI_STREAM_ALIGN_H265_AU; else if (g_strcmp0 (str, "nal") == 0) alignment = GST_VAAPI_STREAM_ALIGN_H265_NALU; else alignment = GST_VAAPI_STREAM_ALIGN_H265_NONE; gst_vaapi_decoder_h265_set_alignment (GST_VAAPI_DECODER_H265 (decode->decoder), alignment); } } break; #endif case GST_VAAPI_CODEC_WMV3: case GST_VAAPI_CODEC_VC1: decode->decoder = gst_vaapi_decoder_vc1_new (dpy, caps); break; #if USE_JPEG_DECODER case GST_VAAPI_CODEC_JPEG: decode->decoder = gst_vaapi_decoder_jpeg_new (dpy, caps); break; #endif #if USE_VP8_DECODER case GST_VAAPI_CODEC_VP8: decode->decoder = gst_vaapi_decoder_vp8_new (dpy, caps); break; #endif #if USE_VP9_DECODER case GST_VAAPI_CODEC_VP9: decode->decoder = gst_vaapi_decoder_vp9_new (dpy, caps); break; #endif default: decode->decoder = NULL; break; } if (!decode->decoder) return FALSE; gst_vaapi_decoder_set_codec_state_changed_func (decode->decoder, gst_vaapi_decoder_state_changed, decode); return TRUE; }