@@ -41,6 +41,7 @@ typedef struct {
4141 GCond cond ;
4242 void * codec_data ;
4343 size_t codec_size ;
44+ struct obs_video_info video_info ;
4445} obs_vaapi_t ;
4546
4647static GstVideoFormat map_video_format (enum video_format format )
@@ -101,6 +102,10 @@ static gchar *get_device_name(gchar *device_name)
101102 int n = scandir ("/dev/dri/by-path/" , & list , scanfilter , versionsort );
102103 gchar * ret = NULL ;
103104
105+ if (n == -1 ) {
106+ return "-- Unknown Name --" ;
107+ }
108+
104109 struct pci_access * pci = pci_alloc ();
105110 pci_init (pci );
106111
@@ -142,15 +147,15 @@ static gchar *get_device_name(gchar *device_name)
142147
143148static const char * get_name (void * type_data )
144149{
145- gchar * * fields = g_regex_split_simple ("( obs-va-va) (renderD\\d+)?(h264|h265|av1)(lp)?enc" , type_data , 0 , 0 );
150+ gchar * * fields = g_regex_split_simple ("obs-va-va(renderD\\d+)?(h264|h265|av1)(lp)?enc" , type_data , 0 , 0 );
146151
147- gchar * devname = get_device_name (g_strcmp0 (fields [2 ], "" ) == 0 ? "renderD128" : fields [2 ]);
152+ gchar * devname = get_device_name (g_strcmp0 (fields [1 ], "" ) == 0 ? "renderD128" : fields [1 ]);
148153
149154 gchar * name = g_strdup_printf ("VAAPI %s on %s%s" ,
150- g_strcmp0 (fields [3 ], "h264" ) == 0 ? "H.264"
151- : g_strcmp0 (fields [3 ], "h265" ) == 0 ? "H.265"
155+ g_strcmp0 (fields [2 ], "h264" ) == 0 ? "H.264"
156+ : g_strcmp0 (fields [2 ], "h265" ) == 0 ? "H.265"
152157 : "AV1" ,
153- devname , g_strcmp0 (fields [4 ], "lp" ) == 0 ? " (Low Power)" : "" );
158+ devname , g_strcmp0 (fields [3 ], "lp" ) == 0 ? " (Low Power)" : "" );
154159
155160 g_free (devname );
156161 g_strfreev (fields );
@@ -170,15 +175,15 @@ static void *create(obs_data_t *settings, obs_encoder_t *encoder)
170175
171176 vaapi -> encoder = encoder ;
172177
173- struct obs_video_info video_info ;
174- obs_get_video_info (& video_info );
178+ obs_get_video_info (& vaapi -> video_info );
175179
176- GstCaps * caps = gst_caps_new_simple ("video/x-raw" , "framerate" , GST_TYPE_FRACTION , video_info .fps_num ,
177- video_info .fps_den , "width" , G_TYPE_INT , obs_encoder_get_width (encoder ),
178- "height" , G_TYPE_INT , obs_encoder_get_height (encoder ), "interlace-mode" ,
179- G_TYPE_STRING , "progressive" , NULL );
180+ GstCaps * caps = gst_caps_new_simple ("video/x-raw" , "framerate" , GST_TYPE_FRACTION , vaapi -> video_info .fps_num ,
181+ vaapi -> video_info .fps_den , "width" , G_TYPE_INT ,
182+ obs_encoder_get_width (encoder ), "height" , G_TYPE_INT ,
183+ obs_encoder_get_height (encoder ), "interlace-mode" , G_TYPE_STRING ,
184+ "progressive" , NULL );
180185
181- switch (video_info .output_format ) {
186+ switch (vaapi -> video_info .output_format ) {
182187 case VIDEO_FORMAT_I420 :
183188 gst_caps_set_simple (caps , "format" , G_TYPE_STRING , "I420" , NULL );
184189 break ;
@@ -199,7 +204,7 @@ static void *create(obs_data_t *settings, obs_encoder_t *encoder)
199204 // NULL);
200205 // break;
201206 default :
202- blog (LOG_ERROR , "[obs-vaapi] unsupported color format: %d" , video_info .output_format );
207+ blog (LOG_ERROR , "[obs-vaapi] unsupported color format: %d" , vaapi -> video_info .output_format );
203208 gst_caps_unref (caps );
204209 return NULL ;
205210 }
@@ -220,9 +225,10 @@ static void *create(obs_data_t *settings, obs_encoder_t *encoder)
220225
221226 GstVideoColorimetry cinfo ;
222227
223- cinfo .range = video_info .range == VIDEO_RANGE_FULL ? GST_VIDEO_COLOR_RANGE_0_255 : GST_VIDEO_COLOR_RANGE_16_235 ;
228+ cinfo .range = vaapi -> video_info .range == VIDEO_RANGE_FULL ? GST_VIDEO_COLOR_RANGE_0_255
229+ : GST_VIDEO_COLOR_RANGE_16_235 ;
224230
225- switch (video_info .colorspace ) {
231+ switch (vaapi -> video_info .colorspace ) {
226232 case VIDEO_CS_601 :
227233 cinfo .matrix = GST_VIDEO_COLOR_MATRIX_BT601 ;
228234 cinfo .transfer = GST_VIDEO_TRANSFER_BT601 ;
@@ -337,8 +343,8 @@ static void *create(obs_data_t *settings, obs_encoder_t *encoder)
337343 gst_object_unref (bus );
338344
339345 blog (LOG_INFO , "[obs-vaapi] codec: %s, %dx%d@%d/%d, format: %s " , obs_encoder_get_id (encoder ),
340- obs_encoder_get_width (encoder ), obs_encoder_get_height (encoder ), video_info .fps_num , video_info . fps_den ,
341- gst_video_format_to_string (map_video_format (video_info .output_format )));
346+ obs_encoder_get_width (encoder ), obs_encoder_get_height (encoder ), vaapi -> video_info .fps_num ,
347+ vaapi -> video_info . fps_den , gst_video_format_to_string (map_video_format (vaapi -> video_info .output_format )));
342348
343349 gst_element_set_state (vaapi -> pipe , GST_STATE_PLAYING );
344350
@@ -388,20 +394,19 @@ static bool encode(void *data, struct encoder_frame *frame, struct encoder_packe
388394{
389395 obs_vaapi_t * vaapi = data ;
390396
397+ * received_packet = false;
398+
391399 if (vaapi -> sample ) {
392400 GstBuffer * buffer = gst_sample_get_buffer (vaapi -> sample );
393401 gst_buffer_unmap (buffer , & vaapi -> info );
394402 gst_sample_unref (vaapi -> sample );
395403 vaapi -> sample = NULL ;
396404 }
397405
398- struct obs_video_info video_info ;
399- obs_get_video_info (& video_info );
400-
401406 GstVideoFormat format = GST_VIDEO_FORMAT_UNKNOWN ;
402407 gsize buffer_size = 0 ;
403408
404- switch (video_info .output_format ) {
409+ switch (vaapi -> video_info .output_format ) {
405410 case VIDEO_FORMAT_I420 :
406411 format = GST_VIDEO_FORMAT_I420 ;
407412 buffer_size = obs_encoder_get_width (vaapi -> encoder ) * obs_encoder_get_height (vaapi -> encoder ) * 3 / 2 ;
@@ -427,7 +432,7 @@ static bool encode(void *data, struct encoder_frame *frame, struct encoder_packe
427432 buffer_size = obs_encoder_get_width (vaapi -> encoder ) * obs_encoder_get_height (vaapi -> encoder ) * 3 ;
428433 break ;
429434 default :
430- break ;
435+ return false ;
431436 }
432437
433438 GstBuffer * buffer =
@@ -444,14 +449,18 @@ static bool encode(void *data, struct encoder_frame *frame, struct encoder_packe
444449
445450 g_mutex_lock (& vaapi -> mutex );
446451
447- gst_app_src_push_buffer (GST_APP_SRC (vaapi -> appsrc ), buffer );
452+ GstFlowReturn ret = gst_app_src_push_buffer (GST_APP_SRC (vaapi -> appsrc ), buffer );
453+ if (ret != GST_FLOW_OK ) {
454+ gst_buffer_unref (buffer );
455+ return false;
456+ }
448457
449458 g_cond_wait (& vaapi -> cond , & vaapi -> mutex );
450459 g_mutex_unlock (& vaapi -> mutex );
451460
452461 vaapi -> sample = gst_app_sink_try_pull_sample (GST_APP_SINK (vaapi -> appsink ), 0 );
453462 if (vaapi -> sample == NULL ) {
454- return true ;
463+ return false ;
455464 }
456465
457466 * received_packet = true;
0 commit comments