FS-7519: increase default video buffer to 2mb in avformat and add vbuf file param to change it per file using a number of bytes with k or m modifier for kilobytes and megabytes

This commit is contained in:
Anthony Minessale 2015-04-15 12:56:07 -05:00 committed by Michael Jerris
parent cbe4f10ba3
commit dd3d6cbe76
3 changed files with 28 additions and 1 deletions

View File

@ -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) */

View File

@ -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", "=", ":");
}

View File

@ -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) {