mirror of
https://github.com/signalwire/freeswitch.git
synced 2025-04-23 03:33:48 +00:00
[core] some mods for file playback to get proper bitrate and timing
This commit is contained in:
parent
d2ccb93f3e
commit
d3ca238b05
@ -2816,6 +2816,7 @@ typedef struct switch_mm_s {
|
|||||||
int cbr;
|
int cbr;
|
||||||
float fps;
|
float fps;
|
||||||
float source_fps;
|
float source_fps;
|
||||||
|
int source_kps;
|
||||||
int vbuf;
|
int vbuf;
|
||||||
switch_video_profile_t vprofile;
|
switch_video_profile_t vprofile;
|
||||||
switch_video_encode_speed_t vencspd;
|
switch_video_encode_speed_t vencspd;
|
||||||
|
@ -1188,6 +1188,11 @@ GCC_DIAG_ON(deprecated-declarations)
|
|||||||
handle->duration = av_rescale_q(context->video_st.st->duration != AV_NOPTS_VALUE ? context->video_st.st->duration : context->fc->duration / AV_TIME_BASE * 1000,
|
handle->duration = av_rescale_q(context->video_st.st->duration != AV_NOPTS_VALUE ? context->video_st.st->duration : context->fc->duration / AV_TIME_BASE * 1000,
|
||||||
context->video_st.st->time_base, AV_TIME_BASE_Q);
|
context->video_st.st->time_base, AV_TIME_BASE_Q);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (context->fc->bit_rate) {
|
||||||
|
handle->mm.source_kps = context->fc->bit_rate / 1024;
|
||||||
|
}
|
||||||
|
|
||||||
if (context->video_st.st->avg_frame_rate.num) {
|
if (context->video_st.st->avg_frame_rate.num) {
|
||||||
handle->mm.source_fps = ceil(av_q2d(context->video_st.st->avg_frame_rate));
|
handle->mm.source_fps = ceil(av_q2d(context->video_st.st->avg_frame_rate));
|
||||||
} else {
|
} else {
|
||||||
|
@ -6840,11 +6840,12 @@ static void *SWITCH_THREAD_FUNC video_write_thread(switch_thread_t *thread, void
|
|||||||
switch_rtp_engine_t *v_engine;
|
switch_rtp_engine_t *v_engine;
|
||||||
int buflen = SWITCH_RTP_MAX_BUF_LEN;
|
int buflen = SWITCH_RTP_MAX_BUF_LEN;
|
||||||
switch_timer_t timer = { 0 };
|
switch_timer_t timer = { 0 };
|
||||||
switch_video_read_flag_t read_flags = SVR_BLOCK;
|
switch_video_read_flag_t read_flags = SVR_FLUSH;
|
||||||
switch_core_session_t *b_session = NULL;
|
switch_core_session_t *b_session = NULL;
|
||||||
switch_fps_t fps_data = { 0 };
|
switch_fps_t fps_data = { 0 };
|
||||||
float fps;
|
float fps;
|
||||||
switch_image_t *last_frame = NULL;
|
switch_image_t *last_frame = NULL;
|
||||||
|
int last_w = 0, last_h = 0, kps = 0;
|
||||||
|
|
||||||
if (switch_core_session_read_lock(session) != SWITCH_STATUS_SUCCESS) {
|
if (switch_core_session_read_lock(session) != SWITCH_STATUS_SUCCESS) {
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -6888,11 +6889,36 @@ static void *SWITCH_THREAD_FUNC video_write_thread(switch_thread_t *thread, void
|
|||||||
|
|
||||||
switch_core_timer_init(&timer, "soft", fps_data.ms, fps_data.samples, switch_core_session_get_pool(session));
|
switch_core_timer_init(&timer, "soft", fps_data.ms, fps_data.samples, switch_core_session_get_pool(session));
|
||||||
|
|
||||||
|
if (smh->video_write_fh && smh->video_write_fh->mm.source_kps) {
|
||||||
|
int min = 0, max = 10000000;
|
||||||
|
const char *var;
|
||||||
|
|
||||||
|
kps = smh->video_write_fh->mm.source_kps;
|
||||||
|
|
||||||
|
if ((var = switch_channel_get_variable(session->channel, "video_file_min_kps"))) {
|
||||||
|
min = atoi(var);
|
||||||
|
if (min < 0) min = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((var = switch_channel_get_variable(session->channel, "video_file_max_kps"))) {
|
||||||
|
max = atoi(var);
|
||||||
|
if (max < 0) max = 10000000;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (min && kps < min) kps = min;
|
||||||
|
if (max != 10000000 && kps > max) kps = max;
|
||||||
|
|
||||||
|
switch_core_media_set_outgoing_bitrate(session, SWITCH_MEDIA_TYPE_VIDEO, kps);
|
||||||
|
}
|
||||||
|
|
||||||
while (smh->video_write_thread_running > 0 &&
|
while (smh->video_write_thread_running > 0 &&
|
||||||
switch_channel_up_nosig(session->channel) && smh->video_write_fh && switch_test_flag(smh->video_write_fh, SWITCH_FILE_OPEN)) {
|
switch_channel_up_nosig(session->channel) && smh->video_write_fh && switch_test_flag(smh->video_write_fh, SWITCH_FILE_OPEN)) {
|
||||||
switch_status_t wstatus = SWITCH_STATUS_FALSE;
|
switch_status_t wstatus = SWITCH_STATUS_FALSE;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
switch_core_timer_next(&timer);
|
switch_core_timer_next(&timer);
|
||||||
|
|
||||||
switch_mutex_lock(v_engine->mh.file_write_mutex);
|
switch_mutex_lock(v_engine->mh.file_write_mutex);
|
||||||
|
|
||||||
//if (smh->video_write_fh && smh->video_write_fh->mm.source_fps && smh->video_write_fh->mm.source_fps != fps) {
|
//if (smh->video_write_fh && smh->video_write_fh->mm.source_fps && smh->video_write_fh->mm.source_fps != fps) {
|
||||||
@ -6903,12 +6929,22 @@ static void *SWITCH_THREAD_FUNC video_write_thread(switch_thread_t *thread, void
|
|||||||
|
|
||||||
if (smh->video_write_fh && !switch_test_flag(smh->video_write_fh, SWITCH_FILE_FLAG_VIDEO_EOF)) {
|
if (smh->video_write_fh && !switch_test_flag(smh->video_write_fh, SWITCH_FILE_FLAG_VIDEO_EOF)) {
|
||||||
wstatus = switch_core_file_read_video(smh->video_write_fh, &fr, read_flags);
|
wstatus = switch_core_file_read_video(smh->video_write_fh, &fr, read_flags);
|
||||||
|
if (wstatus == SWITCH_STATUS_BREAK) {
|
||||||
|
switch_core_timer_sync(&timer);
|
||||||
|
}
|
||||||
|
|
||||||
if (wstatus == SWITCH_STATUS_SUCCESS) {
|
if (wstatus == SWITCH_STATUS_SUCCESS) {
|
||||||
|
if (!kps && fr.img && (last_w != fr.img->d_w || last_h != fr.img->d_h)) {
|
||||||
|
kps = switch_calc_bitrate(fr.img->d_w, fr.img->d_h, 1, fps);
|
||||||
|
switch_core_media_set_outgoing_bitrate(session, SWITCH_MEDIA_TYPE_VIDEO, kps);
|
||||||
|
last_w = fr.img->d_w;
|
||||||
|
last_h = fr.img->d_h;
|
||||||
|
}
|
||||||
|
|
||||||
fr.timestamp = timer.samplecount;
|
fr.timestamp = timer.samplecount;
|
||||||
fr.flags = SFF_USE_VIDEO_TIMESTAMP|SFF_RAW_RTP|SFF_RAW_RTP_PARSE_FRAME;
|
fr.flags = SFF_USE_VIDEO_TIMESTAMP|SFF_RAW_RTP|SFF_RAW_RTP_PARSE_FRAME;
|
||||||
|
|
||||||
if (smh->vid_params.d_width && smh->vid_params.d_height) {
|
if (fr.img && smh->vid_params.d_width && smh->vid_params.d_height) {
|
||||||
switch_img_fit(&fr.img, smh->vid_params.d_width, smh->vid_params.d_height, SWITCH_FIT_SIZE);
|
switch_img_fit(&fr.img, smh->vid_params.d_width, smh->vid_params.d_height, SWITCH_FIT_SIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user