int a_channels;
const char *a_codec;
const char *a_hw_encoder_element;
- /* forward error correction */
+ /* Forward Error Correction */
+ /* ULPFEC */
bool use_ulpfec_red;
int fec_percentage;
+ /* in-band FEC */
+ bool use_inbandfec;
+ int packet_loss_percentage;
} ini_item_media_source_s;
typedef struct _ini_item_rendering_sink_s {
gulong src_pad_probe_id;
bool pause;
bool inbandfec;
+ int packet_loss_percentage;
unsigned int pt;
struct {
unsigned int track_id;
#define INI_ITEM_AUDIO_HW_ENCODER_ELEMENT "audio hw encoder element"
#define INI_ITEM_USE_ULPFEC_RED "use ulpfec red"
#define INI_ITEM_FEC_PERCENTAGE "fec percentage"
+#define INI_ITEM_USE_INBANDFEC "use inbandfec"
+#define INI_ITEM_PACKET_LOSS_PERCENTAGE "packet loss percentage"
#define DEFAULT_VIDEO_RAW_FORMAT "I420"
#define DEFAULT_VIDEO_WIDTH 320
#define DEFAULT_USE_ULPFEC_RED false
#define DEFAULT_FEC_PERCENTAGE 100 /* FEC overhead percentage for the whole stream */
+#define DEFAULT_USE_INBANDFEC false
+#define DEFAULT_PACKET_LOSS_PERCENTAGE 10
/* items for rendering sink */
#define INI_ITEM_AUDIO_SINK_ELEMENT "audio sink element"
__dump_item(INI_ITEM_AUDIO_HW_ENCODER_ELEMENT, INI_ITEM_TYPE_STRING, (void *)source->a_hw_encoder_element);
__dump_item(INI_ITEM_USE_ULPFEC_RED, INI_ITEM_TYPE_BOOL, &source->use_ulpfec_red);
__dump_item(INI_ITEM_FEC_PERCENTAGE, INI_ITEM_TYPE_INT, &source->fec_percentage);
+ __dump_item(INI_ITEM_USE_INBANDFEC, INI_ITEM_TYPE_BOOL, &source->use_inbandfec);
+ __dump_item(INI_ITEM_PACKET_LOSS_PERCENTAGE, INI_ITEM_TYPE_INT, &source->packet_loss_percentage);
}
static bool __is_vpx(const char *v_codec)
is_default ? DEFAULT_USE_ULPFEC_RED : ini->media_source.use_ulpfec_red);
source->fec_percentage = __ini_get_int(ini->dict, category, INI_ITEM_FEC_PERCENTAGE,
is_default ? DEFAULT_FEC_PERCENTAGE : ini->media_source.fec_percentage);
+ source->use_inbandfec = __ini_get_boolean(ini->dict, category, INI_ITEM_USE_INBANDFEC,
+ is_default ? DEFAULT_USE_INBANDFEC : ini->media_source.use_inbandfec);
+ source->packet_loss_percentage = __ini_get_int(ini->dict, category, INI_ITEM_PACKET_LOSS_PERCENTAGE,
+ is_default ? DEFAULT_PACKET_LOSS_PERCENTAGE : ini->media_source.packet_loss_percentage);
}
int _load_ini(webrtc_s *webrtc)
} else if (g_strrstr(encoder_name, "opusenc")) {
if (source->av[AV_IDX_AUDIO].inbandfec) {
- g_object_set(G_OBJECT(encoder), "inband-fec", TRUE, NULL);
- g_object_set(G_OBJECT(encoder), "packet-loss-percentage", 10, NULL); /* TODO: set this value from ini or API */
- LOG_DEBUG("[%s] inband-fec(%d)", encoder_name, TRUE);
+ g_object_set(G_OBJECT(encoder),
+ "inband-fec", TRUE,
+ "packet-loss-percentage", source->av[AV_IDX_AUDIO].packet_loss_percentage,
+ NULL);
+
+ LOG_DEBUG("[%s] inband-fec(%d), packet-loss-percentage(%d)",
+ encoder_name, TRUE, source->av[AV_IDX_AUDIO].packet_loss_percentage);
}
}
goto exit;
APPEND_ELEMENT(element_list, volume);
+ source->av[AV_IDX_AUDIO].inbandfec = ini_source->use_inbandfec;
+ source->av[AV_IDX_AUDIO].packet_loss_percentage = ini_source->packet_loss_percentage;
+
if ((ret = __create_rest_of_elements(webrtc, source, true, &element_list, true)) != WEBRTC_ERROR_NONE)
goto exit;
goto exit;
APPEND_ELEMENT(element_list, volume);
+ source->av[AV_IDX_AUDIO].inbandfec = ini_source->use_inbandfec;
+ source->av[AV_IDX_AUDIO].packet_loss_percentage = ini_source->packet_loss_percentage;
+
if ((ret = __create_rest_of_elements(webrtc, source, true, &element_list, true)) != WEBRTC_ERROR_NONE)
goto exit;