]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
FS-8240 add video profile param for recording 264 and make it default
authorAnthony Minessale <anthm@freeswitch.org>
Wed, 30 Sep 2015 16:42:40 +0000 (11:42 -0500)
committerAnthony Minessale <anthm@freeswitch.org>
Wed, 30 Sep 2015 16:42:46 +0000 (11:42 -0500)
src/include/switch_module_interfaces.h
src/mod/applications/mod_av/avformat.c
src/switch_core_file.c

index feb9337d5467cb5907db5af31c99e0b4b55bdd25..1d31bc8b880e342e805e256f665d8b3666085300 100644 (file)
@@ -305,6 +305,12 @@ typedef enum {
        SWITCH_VIDEO_ENCODE_SPEED_FAST
 } switch_video_encode_speed_t;
 
+typedef enum {
+       SWITCH_VIDEO_PROFILE_BASELINE,
+       SWITCH_VIDEO_PROFILE_MAIN,
+       SWITCH_VIDEO_PROFILE_HIGH
+} switch_video_profile_t;
+
 typedef struct switch_mm_s {
        int samplerate;
        int channels;
@@ -314,7 +320,9 @@ typedef struct switch_mm_s {
        int vw;
        int vh;
        float fps;
+       float source_fps;
        int vbuf;
+       switch_video_profile_t vprofile;
        switch_video_encode_speed_t vencspd;
 } switch_mm_t;
 
index 6b1accb7c12bf33c795bea8b6795b860f82dd075..ab3fc2b9ce25bf5e84fc70885c4d0a8787a5b76a 100644 (file)
@@ -312,18 +312,34 @@ 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->vprofile) {
+                       case SWITCH_VIDEO_PROFILE_BASELINE:
+                               av_opt_set(c->priv_data, "profile", "baseline", 0);
+                               c->level = 41;
+                               break;
+                       case SWITCH_VIDEO_PROFILE_MAIN:
+                               av_opt_set(c->priv_data, "profile", "main", 0);
+                               av_opt_set(c->priv_data, "level", "5", 0);
+                               break;
+                       case SWITCH_VIDEO_PROFILE_HIGH:
+                               av_opt_set(c->priv_data, "profile", "high", 0);
+                               av_opt_set(c->priv_data, "level", "52", 0);
+                               break;
+                       }
+                       
                        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;
+                       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", "veryfast", 0);
+                               av_opt_set(c->priv_data, "tune", "zerolatency", 0);
+                               break;
+                       default:
+                               break;
                        }
                }
 
@@ -1147,7 +1163,8 @@ static switch_status_t open_input_file(av_file_context_t *context, switch_file_h
                        if (switch_test_flag(handle, SWITCH_FILE_FLAG_VIDEO)) {
                                context->has_video = 1;
                        }
-                       context->read_fps = (int)ceil(av_q2d(context->video_st.st->avg_frame_rate));
+                       handle->mm.source_fps = ceil(av_q2d(context->video_st.st->avg_frame_rate));
+                       context->read_fps = (int)handle->mm.source_fps;
                }
        }
 
@@ -1510,6 +1527,8 @@ static switch_status_t av_file_open(switch_file_handle_t *handle, const char *pa
                        handle->samplerate = 44100;
                        handle->mm.samplerate = 44100;
                        handle->mm.ab = 128;
+                       //handle->mm.vencspd = SWITCH_VIDEO_ENCODE_SPEED_FAST;
+                       handle->mm.vprofile = SWITCH_VIDEO_PROFILE_BASELINE;
 
                        if (!handle->mm.vb && handle->mm.vw && handle->mm.vh) {
                                switch(handle->mm.vh) {
index 69433dbdb23335ebf449e794da85a66d207f6802..c6d92ded06c93b0c250334152e2c78b036aee7f5 100644 (file)
@@ -85,6 +85,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_perform_file_open(const char *file,
        fh->mm.keyint = 60;
        fh->mm.ab = 128;
        fh->mm.vencspd = SWITCH_VIDEO_ENCODE_SPEED_DEFAULT;
+       fh->mm.vprofile = SWITCH_VIDEO_PROFILE_BASELINE;
 
        if (*file_path == '{') {
                char *timeout;
@@ -199,6 +200,18 @@ SWITCH_DECLARE(switch_status_t) switch_core_perform_file_open(const char *file,
                                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid video encode speed: %s\n", val);
                        }
                }
+
+               if ((val = switch_event_get_header(fh->params, "vprofile"))) {
+                       if (!strcasecmp(val, "baseline")) {
+                               fh->mm.vprofile = SWITCH_VIDEO_PROFILE_BASELINE;
+                       } else if (!strcasecmp(val, "main")) {
+                               fh->mm.vprofile = SWITCH_VIDEO_PROFILE_MAIN;
+                       } else if (!strcasecmp(val, "high")) {
+                               fh->mm.vprofile = SWITCH_VIDEO_PROFILE_HIGH;
+                       } else {
+                               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid video profile: %s\n", val);
+                       }
+               }
        }
 
        if (switch_directory_exists(file_path, fh->memory_pool) == SWITCH_STATUS_SUCCESS) {