diff --git a/src/include/switch_module_interfaces.h b/src/include/switch_module_interfaces.h index 3a50709b4d..88387033cc 100644 --- a/src/include/switch_module_interfaces.h +++ b/src/include/switch_module_interfaces.h @@ -307,6 +307,7 @@ typedef struct switch_mm_s { int vw; int vh; float fps; + int vbuf; } switch_mm_t; /*! an abstract representation of a file handle (some parameters based on compat with libsndfile) */ diff --git a/src/mod/formats/mod_avformat/mod_avformat.c b/src/mod/formats/mod_avformat/mod_avformat.c index 46a59f90a9..abeec3633e 100644 --- a/src/mod/formats/mod_avformat/mod_avformat.c +++ b/src/mod/formats/mod_avformat/mod_avformat.c @@ -177,6 +177,8 @@ static switch_status_t add_stream(OutputStream *ost, AVFormatContext *oc, AVCode AVCodecContext *c; switch_status_t status = SWITCH_STATUS_FALSE; int threads = switch_core_cpu_count(); + int buffer_bytes = 2097152; /* 2 mb */ + /* find the encoder */ *codec = avcodec_find_encoder(codec_id); if (!(*codec)) { @@ -217,6 +219,13 @@ static switch_status_t add_stream(OutputStream *ost, AVFormatContext *oc, AVCode break; case AVMEDIA_TYPE_VIDEO: + + if (mm) { + if (mm->vbuf) { + buffer_bytes = mm->vbuf; + } + } + c->codec_id = codec_id; c->bit_rate = 1000000; /* Resolution must be a multiple of two. */ @@ -227,7 +236,8 @@ static switch_status_t add_stream(OutputStream *ost, AVFormatContext *oc, AVCode c->gop_size = 25; /* emit one intra frame every x frames at most */ c->pix_fmt = AV_PIX_FMT_YUV420P; c->thread_count = threads; - c->rc_initial_buffer_occupancy = 1024 * 1024 * 8; + c->rc_initial_buffer_occupancy = buffer_bytes * 8; + if (codec_id == AV_CODEC_ID_VP8) { av_set_options_string(c, "quality=realtime", "=", ":"); } diff --git a/src/switch_core_file.c b/src/switch_core_file.c index 356a96669c..528681363f 100644 --- a/src/switch_core_file.c +++ b/src/switch_core_file.c @@ -157,6 +157,22 @@ SWITCH_DECLARE(switch_status_t) switch_core_perform_file_open(const char *file, fh->mm.fps = ftmp; } } + + if ((val = switch_event_get_header(fh->params, "vbuf"))) { + tmp = atoi(val); + + if (strrchr(val, 'k')) { + tmp *= 1024; + } else if (strrchr(val, 'm')) { + tmp *= 1048576; + } + + if (tmp > 0 && tmp < 52428800 /*50mb*/) { + fh->mm.vbuf = tmp; + } else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid buffer size: %d\n", tmp); + } + } } if (switch_directory_exists(file_path, fh->memory_pool) == SWITCH_STATUS_SUCCESS) {