add the -f videoflip option, modeled on flip and rotate in RPiPlay

This commit is contained in:
fduncanh
2021-08-02 18:42:22 -04:00
parent 5166d050ba
commit f0070c065d
4 changed files with 87 additions and 16 deletions

View File

@@ -33,10 +33,18 @@ extern "C" {
#include "../lib/logger.h"
#include "../lib/raop_ntp.h"
typedef enum videoflip_e {
NONE,
LEFT,
RIGHT,
INVERT,
VFLIP,
HFLIP,
} videoflip_t;
typedef struct video_renderer_s video_renderer_t;
video_renderer_t *video_renderer_init(logger_t *logger, const char *server_name);
video_renderer_t *video_renderer_init(logger_t *logger, const char *server_name, videoflip_t videoflip);
void video_renderer_start(video_renderer_t *renderer);
void video_renderer_render_buffer(video_renderer_t *renderer, raop_ntp_t *ntp, unsigned char* data, int data_len, uint64_t pts, int type);
void video_renderer_flush(video_renderer_t *renderer);

View File

@@ -53,7 +53,7 @@ static gboolean check_plugins (void)
return ret;
}
video_renderer_t *video_renderer_init(logger_t *logger, const char *server_name) {
video_renderer_t *video_renderer_init(logger_t *logger, const char *server_name, videoflip_t videoflip) {
video_renderer_t *renderer;
GError *error = NULL;
@@ -71,8 +71,29 @@ video_renderer_t *video_renderer_init(logger_t *logger, const char *server_name)
assert(check_plugins ());
renderer->pipeline = gst_parse_launch("appsrc name=video_source stream-type=0 format=GST_FORMAT_TIME is-live=true !"
"queue ! decodebin ! videoconvert ! autovideosink name=video_sink sync=false", &error);
GString *launch = g_string_new("appsrc name=video_source stream-type=0 format=GST_FORMAT_TIME is-live=true !"
"queue ! decodebin ! videoconvert ! ");
/* image transform */
switch (videoflip) {
case LEFT:
g_string_append(launch, "videoflip method=counterclockwise ! ");
break;
case RIGHT:
g_string_append(launch, "videoflip method=clockwise ! ");
break;
case INVERT:
g_string_append(launch, "videoflip method=rotate-180 ! ");
break;
case HFLIP:
g_string_append(launch, "videoflip method=horizontal-flip ! ");
break;
case VFLIP:
g_string_append(launch, "videoflip method=vertical-flip ! ");
}
g_string_append(launch, "autovideosink name=video_sink sync=false");
renderer->pipeline = gst_parse_launch(launch->str, &error);
g_assert (renderer->pipeline);
renderer->appsrc = gst_bin_get_by_name (GST_BIN (renderer->pipeline), "video_source");