summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--pjmedia/src/pjmedia/vid_stream.c23
1 files changed, 14 insertions, 9 deletions
diff --git a/pjmedia/src/pjmedia/vid_stream.c b/pjmedia/src/pjmedia/vid_stream.c
index 4b56770b..0e3dfb44 100644
--- a/pjmedia/src/pjmedia/vid_stream.c
+++ b/pjmedia/src/pjmedia/vid_stream.c
@@ -1011,7 +1011,7 @@ static pj_status_t decode_frame(pjmedia_vid_stream *stream,
}
/* Learn remote frame rate after successful decoding */
- if (0 && frame->type == PJMEDIA_FRAME_TYPE_VIDEO && frame->size)
+ if (frame->type == PJMEDIA_FRAME_TYPE_VIDEO && frame->size)
{
/* Only check remote frame rate when timestamp is not wrapping and
* sequence is increased by 1.
@@ -1025,23 +1025,28 @@ static pj_status_t decode_frame(pjmedia_vid_stream *stream,
ts_diff = last_ts - stream->last_dec_ts;
vfd = pjmedia_format_get_video_format_detail(
&channel->port.info.fmt, PJ_TRUE);
- if ((int)(stream->info.codec_info.clock_rate / ts_diff) !=
- vfd->fps.num / vfd->fps.denum)
+ if (stream->info.codec_info.clock_rate * vfd->fps.denum !=
+ vfd->fps.num * ts_diff)
{
/* Frame rate changed, update decoding port info */
- vfd->fps.num = stream->info.codec_info.clock_rate;
- vfd->fps.denum = ts_diff;
+ if (stream->info.codec_info.clock_rate % ts_diff == 0) {
+ vfd->fps.num = stream->info.codec_info.clock_rate/ts_diff;
+ vfd->fps.denum = 1;
+ } else {
+ vfd->fps.num = stream->info.codec_info.clock_rate;
+ vfd->fps.denum = ts_diff;
+ }
/* Update stream info */
stream->info.codec_param->dec_fmt.det.vid.fps = vfd->fps;
- PJ_LOG(5, (channel->port.info.name.ptr,
- "Frame rate changed to %d/%d(~%d)fps",
+ PJ_LOG(6, (channel->port.info.name.ptr,
+ "Frame rate update: %d/%d(~%.2f)fps",
vfd->fps.num, vfd->fps.denum,
- vfd->fps.num / vfd->fps.denum));
+ vfd->fps.num*1.0 / vfd->fps.denum));
/* Publish PJMEDIA_EVENT_FMT_CHANGED event */
- {
+ if (0) {
pjmedia_event event;
dump_port_info(stream->dec, "changed");