]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
FS-11958: [core] add switch_core_media functions that deal with bw and bitrate
authorDragos Oancea <dragos@signalwire.com>
Tue, 16 Apr 2019 00:05:23 +0000 (00:05 +0000)
committerDragos Oancea <dragos@signalwire.com>
Thu, 25 Jul 2019 17:08:58 +0000 (17:08 +0000)
src/include/switch_core_media.h
src/switch_core_media.c

index ef9ddda9649add85e0f44e349e49ca71344cd0d4..cb454c49836d074e15ecbeade257cc1954f58444 100644 (file)
@@ -365,6 +365,9 @@ SWITCH_DECLARE(switch_file_handle_t *) switch_core_media_get_video_file(switch_c
 SWITCH_DECLARE(switch_bool_t) switch_core_session_in_video_thread(switch_core_session_t *session);
 SWITCH_DECLARE(switch_bool_t) switch_core_media_check_dtls(switch_core_session_t *session, switch_media_type_t type);
 SWITCH_DECLARE(switch_status_t) switch_core_media_set_outgoing_bitrate(switch_core_session_t *session, switch_media_type_t type, uint32_t bitrate);
+SWITCH_DECLARE(uint32_t) switch_core_media_get_orig_bitrate(switch_core_session_t *session, switch_media_type_t type);
+SWITCH_DECLARE(void) switch_core_media_set_media_bw_mult(switch_core_session_t *session, float mult);
+SWITCH_DECLARE(float) switch_core_media_get_media_bw_mult(switch_core_session_t *session);
 SWITCH_DECLARE(switch_status_t) switch_core_media_reset_jb(switch_core_session_t *session, switch_media_type_t type);
 SWITCH_DECLARE(switch_status_t) switch_core_session_wait_for_video_input_params(switch_core_session_t *session, uint32_t timeout_ms);
 
index 7be9ac55a1530566173a90563703fed4b7cae762..2b09bb8bb3b824d774eddd7413672be37f19a46d 100644 (file)
@@ -196,6 +196,8 @@ typedef struct switch_rtp_engine_s {
        uint8_t new_ice;
        uint8_t new_dtls;
        uint32_t sdp_bw;
+       uint32_t orig_bitrate;
+       float bw_mult;
        uint8_t reject_avp;
        int t140_pt;
        int red_pt;
@@ -12434,12 +12436,34 @@ SWITCH_DECLARE(switch_bool_t) switch_core_media_check_dtls(switch_core_session_t
        return SWITCH_FALSE;
 }
 
+SWITCH_DECLARE(uint32_t) switch_core_media_get_orig_bitrate(switch_core_session_t *session, switch_media_type_t type) 
+{
+       switch_media_handle_t *smh;
+       switch_rtp_engine_t *engine;
+
+       if (!(smh = session->media_handle)) {
+               return 0;
+       }
+
+       if (switch_channel_down(session->channel)) {
+               return 0;
+       }
+
+       engine = &smh->engines[type];
+
+       if (engine) {
+               return engine->orig_bitrate;
+       } else {
+               return 0;
+       }
+}
 
 SWITCH_DECLARE(switch_status_t) switch_core_media_set_outgoing_bitrate(switch_core_session_t *session, switch_media_type_t type, uint32_t bitrate)
 {
        switch_media_handle_t *smh;
        switch_rtp_engine_t *engine;
        switch_status_t status = SWITCH_STATUS_FALSE;
+       uint32_t new_bitrate;
 
        if (!(smh = session->media_handle)) {
                return SWITCH_STATUS_FALSE;
@@ -12451,14 +12475,57 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_set_outgoing_bitrate(switch_co
 
        engine = &smh->engines[type];
 
+       new_bitrate = bitrate - bitrate * engine->bw_mult;
        if (switch_core_codec_ready(&engine->write_codec)) {
                status = switch_core_codec_control(&engine->write_codec, SCC_VIDEO_BANDWIDTH,
-                                                                                  SCCT_INT, &bitrate, SCCT_NONE, NULL, NULL, NULL);
+                                                                                  SCCT_INT, &new_bitrate, SCCT_NONE, NULL, NULL, NULL);
        }
+       engine->orig_bitrate = bitrate;
 
        return status;
 }
 
+SWITCH_DECLARE(float) switch_core_media_get_media_bw_mult(switch_core_session_t *session) 
+{
+       switch_media_handle_t *smh;
+       switch_rtp_engine_t *engine;
+
+       if (!(smh = session->media_handle)) {
+               return 0;
+       }
+
+       if (switch_channel_down(session->channel)) {
+               return 0;
+       }
+
+       engine = &smh->engines[SWITCH_MEDIA_TYPE_VIDEO];
+
+       if (engine) {
+               return engine->bw_mult;
+       }
+       return 0;
+}
+
+SWITCH_DECLARE(void) switch_core_media_set_media_bw_mult(switch_core_session_t *session, float mult)
+{
+       switch_media_handle_t *smh;
+       switch_rtp_engine_t *engine;
+
+       if (!(smh = session->media_handle)) {
+               return;
+       }
+
+       if (switch_channel_down(session->channel)) {
+               return;
+       }
+
+       engine = &smh->engines[SWITCH_MEDIA_TYPE_VIDEO];
+
+       if (engine) {
+               engine->bw_mult = mult;
+       }
+}
+
 //?
 SWITCH_DECLARE(switch_status_t) switch_core_media_reset_jb(switch_core_session_t *session, switch_media_type_t type)
 {