summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoshua Colp <jcolp@digium.com>2016-09-14 08:59:51 -0400
committerJoshua Colp <jcolp@digium.com>2016-09-14 12:58:10 -0500
commit89764f7ae9acee638f0a5ddeda5cfd9b525e84bb (patch)
tree65af377f78756bc97de293699eb3898aaa1046bd
parentcbd6f7001e7aa469cfe3e31fdc9b32ad22c2468e (diff)
rtp: Preserve timestamps on video frames.
Currently when receiving video over RTP we store only a calculated samples on the frame. When starting the video it can take some time for this calculation to actually yield a value as it requires constant changing timestamps. As well if a video frame passes over multiple RTP packets this calculation will fail as the timestamp is the same as the previous RTP packet and the number of samples calculated will be 0. This change preserves the timestamp on the frame and allows it to pass through the core. When sending the video this timestamp is used instead of a new one being calculated. ASTERISK-26367 #close Change-Id: Iba8179fb5c14c9443aee4baf670d2185da3ecfbd
-rw-r--r--main/codec_builtin.c6
-rw-r--r--res/res_rtp_asterisk.c2
2 files changed, 8 insertions, 0 deletions
diff --git a/main/codec_builtin.c b/main/codec_builtin.c
index facb5a84c..1f2cb9270 100644
--- a/main/codec_builtin.c
+++ b/main/codec_builtin.c
@@ -758,36 +758,42 @@ static struct ast_codec h261 = {
.name = "h261",
.description = "H.261 video",
.type = AST_MEDIA_TYPE_VIDEO,
+ .sample_rate = 1000,
};
static struct ast_codec h263 = {
.name = "h263",
.description = "H.263 video",
.type = AST_MEDIA_TYPE_VIDEO,
+ .sample_rate = 1000,
};
static struct ast_codec h263p = {
.name = "h263p",
.description = "H.263+ video",
.type = AST_MEDIA_TYPE_VIDEO,
+ .sample_rate = 1000,
};
static struct ast_codec h264 = {
.name = "h264",
.description = "H.264 video",
.type = AST_MEDIA_TYPE_VIDEO,
+ .sample_rate = 1000,
};
static struct ast_codec mpeg4 = {
.name = "mpeg4",
.description = "MPEG4 video",
.type = AST_MEDIA_TYPE_VIDEO,
+ .sample_rate = 1000,
};
static struct ast_codec vp8 = {
.name = "vp8",
.description = "VP8 video",
.type = AST_MEDIA_TYPE_VIDEO,
+ .sample_rate = 1000,
};
static struct ast_codec t140red = {
diff --git a/res/res_rtp_asterisk.c b/res/res_rtp_asterisk.c
index a8d4a9077..d6eea3ce0 100644
--- a/res/res_rtp_asterisk.c
+++ b/res/res_rtp_asterisk.c
@@ -4763,6 +4763,8 @@ static struct ast_frame *ast_rtp_read(struct ast_rtp_instance *instance, int rtc
/* Video -- samples is # of samples vs. 90000 */
if (!rtp->lastividtimestamp)
rtp->lastividtimestamp = timestamp;
+ ast_set_flag(&rtp->f, AST_FRFLAG_HAS_TIMING_INFO);
+ rtp->f.ts = timestamp / (rtp_get_rate(rtp->f.subclass.format) / 1000);
rtp->f.samples = timestamp - rtp->lastividtimestamp;
rtp->lastividtimestamp = timestamp;
rtp->f.delivery.tv_sec = 0;