Skip to content

Commit

Permalink
Refactor renderer init functions
Browse files Browse the repository at this point in the history
The list of arguments to the renderer init functions was ballooning, so
this commit changes the organization so the video and audio renderer
init functions simply take a struct containing all of the configuration
info.

I also fixed a couple of small code style issues.
  • Loading branch information
dougg3 authored and FD- committed Sep 21, 2020
1 parent 5f0b971 commit 284a22b
Show file tree
Hide file tree
Showing 9 changed files with 103 additions and 89 deletions.
11 changes: 8 additions & 3 deletions renderers/audio_renderer.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,11 @@ typedef enum audio_renderer_type_e {
AUDIO_RENDERER_GSTREAMER
} audio_renderer_type_t;

typedef struct audio_renderer_config_s {
audio_device_t device;
bool low_latency;
} audio_renderer_config_t;

typedef struct audio_renderer_s audio_renderer_t;

typedef struct audio_renderer_funcs_s {
Expand All @@ -54,9 +59,9 @@ typedef struct audio_renderer_s {
audio_renderer_type_t type;
} audio_renderer_t;

audio_renderer_t *audio_renderer_dummy_init(logger_t *logger, video_renderer_t *video_renderer, audio_device_t device, bool low_latency);
audio_renderer_t *audio_renderer_rpi_init(logger_t *logger, video_renderer_t *video_renderer, audio_device_t device, bool low_latency);
audio_renderer_t *audio_renderer_gstreamer_init(logger_t *logger, video_renderer_t *video_renderer, audio_device_t device, bool low_latency);
audio_renderer_t *audio_renderer_dummy_init(logger_t *logger, video_renderer_t *video_renderer, audio_renderer_config_t const *config);
audio_renderer_t *audio_renderer_rpi_init(logger_t *logger, video_renderer_t *video_renderer, audio_renderer_config_t const *config);
audio_renderer_t *audio_renderer_gstreamer_init(logger_t *logger, video_renderer_t *video_renderer, audio_renderer_config_t const *config);

#ifdef __cplusplus
}
Expand Down
2 changes: 1 addition & 1 deletion renderers/audio_renderer_dummy.c
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ typedef struct audio_renderer_dummy_s {

static const audio_renderer_funcs_t audio_renderer_dummy_funcs;

audio_renderer_t *audio_renderer_dummy_init(logger_t *logger, video_renderer_t *video_renderer, audio_device_t device, bool low_latency) {
audio_renderer_t *audio_renderer_dummy_init(logger_t *logger, video_renderer_t *video_renderer, audio_renderer_config_t const *config) {
audio_renderer_dummy_t *renderer;
renderer = calloc(1, sizeof(audio_renderer_dummy_t));
if (!renderer) {
Expand Down
2 changes: 1 addition & 1 deletion renderers/audio_renderer_gstreamer.c
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ static gboolean check_plugins(void)
return ret;
}

audio_renderer_t *audio_renderer_gstreamer_init(logger_t *logger, video_renderer_t *video_renderer, audio_device_t device, bool low_latency) {
audio_renderer_t *audio_renderer_gstreamer_init(logger_t *logger, video_renderer_t *video_renderer, audio_renderer_config_t const *config) {
audio_renderer_gstreamer_t *renderer;
GError *error = NULL;

Expand Down
16 changes: 8 additions & 8 deletions renderers/audio_renderer_rpi.c
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ extern COMPONENT_T *video_renderer_rpi_get_clock(video_renderer_t *renderer);
typedef struct audio_renderer_rpi_s {
audio_renderer_t base;
video_renderer_t *video_renderer;
bool low_latency;
audio_renderer_config_t const *config;

HANDLE_AACDECODER audio_decoder;

Expand Down Expand Up @@ -109,7 +109,7 @@ static void audio_renderer_rpi_destroy_renderer(audio_renderer_rpi_t *renderer)
}
}

static int audio_renderer_rpi_init_renderer(audio_renderer_rpi_t *renderer, video_renderer_t *video_renderer, audio_device_t device) {
static int audio_renderer_rpi_init_renderer(audio_renderer_rpi_t *renderer, video_renderer_t *video_renderer) {
memset(renderer->components, 0, sizeof(renderer->components));

if (video_renderer) {
Expand Down Expand Up @@ -217,7 +217,7 @@ static int audio_renderer_rpi_init_renderer(audio_renderer_rpi_t *renderer, vide
}

// Set audio device
const char *device_name = device == AUDIO_DEVICE_HDMI ? "hdmi" : "local";
const char *device_name = renderer->config->device == AUDIO_DEVICE_HDMI ? "hdmi" : "local";
OMX_CONFIG_BRCMAUDIODESTINATIONTYPE audio_destination;
memset(&audio_destination, 0, sizeof(OMX_CONFIG_BRCMAUDIODESTINATIONTYPE));
audio_destination.nSize = sizeof(OMX_CONFIG_BRCMAUDIODESTINATIONTYPE);
Expand All @@ -236,7 +236,7 @@ static int audio_renderer_rpi_init_renderer(audio_renderer_rpi_t *renderer, vide
return 1;
}

audio_renderer_t *audio_renderer_rpi_init(logger_t *logger, video_renderer_t *video_renderer, audio_device_t device, bool low_latency) {
audio_renderer_t *audio_renderer_rpi_init(logger_t *logger, video_renderer_t *video_renderer, audio_renderer_config_t const *config) {
audio_renderer_rpi_t *renderer;
renderer = calloc(1, sizeof(audio_renderer_rpi_t));
if (!renderer) {
Expand All @@ -251,7 +251,7 @@ audio_renderer_t *audio_renderer_rpi_init(logger_t *logger, video_renderer_t *vi
video_renderer = NULL;
}
renderer->video_renderer = video_renderer;
renderer->low_latency = low_latency;
renderer->config = config;

renderer->first_packet_time = 0;
renderer->input_frames = 0;
Expand All @@ -261,7 +261,7 @@ audio_renderer_t *audio_renderer_rpi_init(logger_t *logger, video_renderer_t *vi
renderer = NULL;
}

if (audio_renderer_rpi_init_renderer(renderer, video_renderer, device) != 1) {
if (audio_renderer_rpi_init_renderer(renderer, video_renderer) != 1) {
audio_renderer_rpi_destroy_decoder(renderer);
free(renderer);
renderer = NULL;
Expand Down Expand Up @@ -339,11 +339,11 @@ static void audio_renderer_rpi_render_buffer(audio_renderer_t *renderer, raop_nt
buffer->nFilledLen = chunk_size;
buffer->nOffset = 0;

if (!r->low_latency) buffer->nTimeStamp = ilclient_ticks_from_s64(pts);
if (!r->config->low_latency) buffer->nTimeStamp = ilclient_ticks_from_s64(pts);
if (r->first_packet_time == 0) {
buffer->nFlags = OMX_BUFFERFLAG_STARTTIME;
r->first_packet_time = raop_ntp_get_local_time(ntp);
if (!r->low_latency) buffer->nTimeStamp = ilclient_ticks_from_s64(r->first_packet_time);
if (!r->config->low_latency) buffer->nTimeStamp = ilclient_ticks_from_s64(r->first_packet_time);
}

if (OMX_EmptyThisBuffer(ILC_GET_HANDLE(r->audio_renderer), buffer) != OMX_ErrorNone) {
Expand Down
13 changes: 10 additions & 3 deletions renderers/video_renderer.h
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,13 @@ typedef enum flip_mode_e {
FLIP_BOTH
} flip_mode_t;

typedef struct video_renderer_config_s {
background_mode_t background_mode;
bool low_latency;
int rotation;
flip_mode_t flip;
} video_renderer_config_t;

typedef struct video_renderer_s video_renderer_t;

typedef struct video_renderer_funcs_s {
Expand All @@ -78,9 +85,9 @@ typedef struct video_renderer_s {
video_renderer_type_t type;
} video_renderer_t;

video_renderer_t *video_renderer_dummy_init(logger_t *logger, background_mode_t background_mode, bool low_latency, int rotation, flip_mode_t flip);
video_renderer_t *video_renderer_rpi_init(logger_t *logger, background_mode_t background_mode, bool low_latency, int rotation, flip_mode_t flip);
video_renderer_t *video_renderer_gstreamer_init(logger_t *logger, background_mode_t background_mode, bool low_latency, int rotation, flip_mode_t flip);
video_renderer_t *video_renderer_dummy_init(logger_t *logger, video_renderer_config_t const *config);
video_renderer_t *video_renderer_rpi_init(logger_t *logger, video_renderer_config_t const *config);
video_renderer_t *video_renderer_gstreamer_init(logger_t *logger, video_renderer_config_t const *config);

#ifdef __cplusplus
}
Expand Down
2 changes: 1 addition & 1 deletion renderers/video_renderer_dummy.c
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ typedef struct video_renderer_dummy_s {

static const video_renderer_funcs_t video_renderer_dummy_funcs;

video_renderer_t *video_renderer_dummy_init(logger_t *logger, background_mode_t background_mode, bool low_latency, int rotation, flip_mode_t flip) {
video_renderer_t *video_renderer_dummy_init(logger_t *logger, video_renderer_config_t const *config) {
video_renderer_dummy_t *renderer;
renderer = calloc(1, sizeof(video_renderer_dummy_t));
if (!renderer) {
Expand Down
12 changes: 5 additions & 7 deletions renderers/video_renderer_gstreamer.c
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ static gboolean check_plugins(void)
return ret;
}

video_renderer_t *video_renderer_gstreamer_init(logger_t *logger, background_mode_t background_mode, bool low_latency, int rotation, flip_mode_t flip) {
video_renderer_t *video_renderer_gstreamer_init(logger_t *logger, video_renderer_config_t const *config) {
video_renderer_gstreamer_t *renderer;
GError *error = NULL;

Expand All @@ -71,9 +71,8 @@ video_renderer_t *video_renderer_gstreamer_init(logger_t *logger, background_mod
GString *launch = g_string_new("appsrc name=video_source stream-type=0 format=GST_FORMAT_TIME is-live=true !"
"queue ! decodebin ! videoconvert ! ");
// Setup rotation
if (rotation != 0) {
switch (rotation)
{
if (config->rotation != 0) {
switch (config->rotation) {
case 90:
case -270:
g_string_append(launch, "videoflip method=clockwise ! ");
Expand All @@ -95,9 +94,8 @@ video_renderer_t *video_renderer_gstreamer_init(logger_t *logger, background_mod
}

// Setup flip
if (flip != FLIP_NONE) {
switch (flip)
{
if (config->flip != FLIP_NONE) {
switch (config->flip) {
case FLIP_HORIZONTAL:
g_string_append(launch, "videoflip method=horizontal-flip ! ");
break;
Expand Down
65 changes: 32 additions & 33 deletions renderers/video_renderer_rpi.c
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,7 @@

typedef struct video_renderer_rpi_s {
video_renderer_t base;
bool low_latency;
background_mode_t background_mode;
video_renderer_config_t const *config;

uint16_t background_visits;
DISPMANX_ELEMENT_HANDLE_T background_element;
Expand Down Expand Up @@ -122,9 +121,9 @@ static void video_renderer_rpi_update_background(video_renderer_t *renderer, int
r->background_visits = 0;
}

if (r->background_mode == BACKGROUND_MODE_ON) {
if (r->config->background_mode == BACKGROUND_MODE_ON) {
video_renderer_rpi_render_background(r);
} else if (r->background_mode == BACKGROUND_MODE_AUTO) {
} else if (r->config->background_mode == BACKGROUND_MODE_AUTO) {
// Show background when connection is made and hide background when all connections are gone
if (r->background_visits > 0) {
video_renderer_rpi_render_background(r);
Expand Down Expand Up @@ -154,7 +153,7 @@ static void omx_event_handler(void *userdata, COMPONENT_T *comp, OMX_U32 data) {
logger_log(renderer->base.logger, LOGGER_DEBUG, "Video renderer config change: %p: %d", comp, data);
}

static int video_renderer_rpi_init_decoder(video_renderer_rpi_t *renderer, int rotation, flip_mode_t flip) {
static int video_renderer_rpi_init_decoder(video_renderer_rpi_t *renderer) {
memset(renderer->components, 0, sizeof(renderer->components));
memset(renderer->tunnels, 0, sizeof(renderer->tunnels));

Expand Down Expand Up @@ -272,34 +271,35 @@ static int video_renderer_rpi_init_decoder(video_renderer_rpi_t *renderer, int r
}

// Setup rotation
if (rotation != 0) {
OMX_CONFIG_ROTATIONTYPE omx_rotation;
memset(&omx_rotation, 0, sizeof(OMX_CONFIG_ROTATIONTYPE));
omx_rotation.nSize = sizeof(OMX_CONFIG_ROTATIONTYPE);
// Check the rotation here
if (rotation != 90 && rotation != -90 && rotation != 180 && rotation != -180 && rotation != 270 && rotation != -270) {
printf("Error: Rotation must be +/- 0,90,180,270\n");
video_renderer_rpi_destroy_decoder(renderer);
return -15;
}
omx_rotation.nRotation = rotation;
omx_rotation.nPortIndex = 90;
omx_rotation.nVersion.nVersion = OMX_VERSION;
OMX_ERRORTYPE error = OMX_SetConfig(ilclient_get_handle(renderer->video_renderer), OMX_IndexConfigCommonRotate,
&omx_rotation);
if (error != OMX_ErrorNone) {
printf("Error: %x\n", error);
video_renderer_rpi_destroy_decoder(renderer);
return -15;
}
if (renderer->config->rotation != 0) {
int rotation = renderer->config->rotation;
OMX_CONFIG_ROTATIONTYPE omx_rotation;
memset(&omx_rotation, 0, sizeof(OMX_CONFIG_ROTATIONTYPE));
omx_rotation.nSize = sizeof(OMX_CONFIG_ROTATIONTYPE);
// Check the rotation here
if (rotation != 90 && rotation != -90 && rotation != 180 && rotation != -180 && rotation != 270 && rotation != -270) {
printf("Error: Rotation must be +/- 0,90,180,270\n");
video_renderer_rpi_destroy_decoder(renderer);
return -15;
}
omx_rotation.nRotation = rotation;
omx_rotation.nPortIndex = 90;
omx_rotation.nVersion.nVersion = OMX_VERSION;
OMX_ERRORTYPE error = OMX_SetConfig(ilclient_get_handle(renderer->video_renderer), OMX_IndexConfigCommonRotate,
&omx_rotation);
if (error != OMX_ErrorNone) {
printf("Error: %x\n", error);
video_renderer_rpi_destroy_decoder(renderer);
return -15;
}
}

// Setup flipping
if (flip != FLIP_NONE) {
if (renderer->config->flip != FLIP_NONE) {
OMX_CONFIG_MIRRORTYPE omx_mirror;
memset(&omx_mirror, 0, sizeof(OMX_CONFIG_MIRRORTYPE));
omx_mirror.nSize = sizeof(OMX_CONFIG_MIRRORTYPE);
switch (flip) {
switch (renderer->config->flip) {
case FLIP_HORIZONTAL:
omx_mirror.eMirror = OMX_MirrorHorizontal;
break;
Expand Down Expand Up @@ -345,7 +345,7 @@ static int video_renderer_rpi_init_decoder(video_renderer_rpi_t *renderer, int r
return 1;
}

video_renderer_t *video_renderer_rpi_init(logger_t *logger, background_mode_t background_mode, bool low_latency, int rotation, flip_mode_t flip) {
video_renderer_t *video_renderer_rpi_init(logger_t *logger, video_renderer_config_t const *config) {
video_renderer_rpi_t *renderer;
renderer = calloc(1, sizeof(video_renderer_rpi_t));
if (!renderer) {
Expand All @@ -355,13 +355,12 @@ video_renderer_t *video_renderer_rpi_init(logger_t *logger, background_mode_t ba
renderer->base.logger = logger;
renderer->base.funcs = &video_renderer_rpi_funcs;
renderer->base.type = VIDEO_RENDERER_RPI;
renderer->low_latency = low_latency;
renderer->background_mode = background_mode;
renderer->config = config;

renderer->first_packet_time = 0;
renderer->input_frames = 0;

if (video_renderer_rpi_init_decoder(renderer, rotation, flip) != 1) {
if (video_renderer_rpi_init_decoder(renderer) != 1) {
free(renderer);
renderer = NULL;
}
Expand Down Expand Up @@ -470,11 +469,11 @@ static void video_renderer_rpi_render_buffer(video_renderer_t *renderer, raop_nt
buffer->nFilledLen = chunk_size;
buffer->nOffset = 0;

if (!r->low_latency) buffer->nTimeStamp = ilclient_ticks_from_s64(pts);
if (!r->config->low_latency) buffer->nTimeStamp = ilclient_ticks_from_s64(pts);
if (r->first_packet_time == 0) {
buffer->nFlags = OMX_BUFFERFLAG_STARTTIME;
r->first_packet_time = raop_ntp_get_local_time(ntp);
if (!r->low_latency) buffer->nTimeStamp = ilclient_ticks_from_s64(r->first_packet_time);
if (!r->config->low_latency) buffer->nTimeStamp = ilclient_ticks_from_s64(r->first_packet_time);
}

// Mark the last buffer if we had to split the data (probably not necessary)
Expand Down
Loading

0 comments on commit 284a22b

Please sign in to comment.