]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
FS-7983 Added param for specifying video encoding speed
authorBradley Jokinen <bradleyjokinen@reliancetelephone.com>
Tue, 25 Aug 2015 14:02:53 +0000 (09:02 -0500)
committerBradley Jokinen <bradleyjokinen@reliancetelephone.com>
Tue, 25 Aug 2015 14:02:53 +0000 (09:02 -0500)
With this patch, the param vencspd can be set to slow, medium, or fast to
adjust the speed of video encoding on a per file basis. Currently, this
only has an affect on files recorded using mod_av with H.264 as the video
codec.

src/include/switch_module_interfaces.h
src/mod/applications/mod_av/avformat.c
src/switch_core_file.c

index 88387033cc4cc246a640c4c02cbe027fb9223d5f..a0d7c592a7bdc2ba87fd9407d51551b6d66f642b 100644 (file)
@@ -298,6 +298,13 @@ struct switch_file_interface {
        struct switch_file_interface *next;
 };
 
+typedef enum {
+       SWITCH_VIDEO_ENCODE_SPEED_DEFAULT;
+       SWITCH_VIDEO_ENCODE_SPEED_SLOW,
+       SWITCH_VIDEO_ENCODE_SPEED_MEDIUM,
+       SWITCH_VIDEO_ENCODE_SPEED_FAST
+} switch_video_encode_speed_t;
+
 typedef struct switch_mm_s {
        int samplerate;
        int channels;
@@ -308,6 +315,7 @@ typedef struct switch_mm_s {
        int vh;
        float fps;
        int vbuf;
+       switch_video_encode_speed_t vencspd;
 } switch_mm_t;
 
 /*! an abstract representation of a file handle (some parameters based on compat with libsndfile) */
index 7dd87ab718ce6a03047b89b28cf2aac7aa2c349c..7ee37dfcbea94bda9d63f6ef489c2fc571056d90 100644 (file)
@@ -299,6 +299,20 @@ static switch_status_t add_stream(MediaStream *mst, AVFormatContext *fc, AVCodec
 
                if (codec_id == AV_CODEC_ID_H264) {
                        c->ticks_per_frame = 2;
+
+                       switch (mm->vencspd) {
+                               case SWITCH_VIDEO_ENCODE_SPEED_SLOW:
+                                       av_opt_set(c->priv_data, "preset", "veryslow", 0);
+                                       break;
+                               case SWITCH_VIDEO_ENCODE_SPEED_MEDIUM:
+                                       av_opt_set(c->priv_data, "preset", "medium", 0);
+                                       break;
+                               case SWITCH_VIDEO_ENCODE_SPEED_FAST:
+                                       av_opt_set(c->priv_data, "preset", "ultrafast", 0);
+                                       break;
+                               default:
+                                       break;
+                       }
                }
 
                if (codec_id == AV_CODEC_ID_VP8) {
index 1ed96db3d33e569d2b5b94fb8b62f57c3e747b89..69433dbdb23335ebf449e794da85a66d207f6802 100644 (file)
@@ -84,6 +84,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_perform_file_open(const char *file,
        fh->mm.channels = 1;
        fh->mm.keyint = 60;
        fh->mm.ab = 128;
+       fh->mm.vencspd = SWITCH_VIDEO_ENCODE_SPEED_DEFAULT;
 
        if (*file_path == '{') {
                char *timeout;
@@ -186,6 +187,18 @@ SWITCH_DECLARE(switch_status_t) switch_core_perform_file_open(const char *file,
                                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid buffer size: %d\n", tmp);
                        }
                }
+
+               if ((val = switch_event_get_header(fh->params, "vencspd"))) {
+                       if (!strcasecmp(val, "slow")) {
+                               fh->mm.vencspd = SWITCH_VIDEO_ENCODE_SPEED_SLOW;
+                       } else if (!strcasecmp(val, "medium")) {
+                               fh->mm.vencspd = SWITCH_VIDEO_ENCODE_SPEED_MEDIUM;
+                       } else if (!strcasecmp(val, "fast")) {
+                               fh->mm.vencspd = SWITCH_VIDEO_ENCODE_SPEED_FAST;
+                       } else {
+                               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid video encode speed: %s\n", val);
+                       }
+               }
        }
 
        if (switch_directory_exists(file_path, fh->memory_pool) == SWITCH_STATUS_SUCCESS) {