Skip to content

Commit a21c58c

Browse files
committed
some cleanups
1 parent 4e06e0c commit a21c58c

1 file changed

Lines changed: 33 additions & 24 deletions

File tree

obs-vaapi.c

Lines changed: 33 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -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

4647
static 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

143148
static 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

Comments
 (0)