]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
rtp: Preserve timestamps on video frames. 99/3899/2
authorJoshua Colp <jcolp@digium.com>
Wed, 14 Sep 2016 12:59:51 +0000 (08:59 -0400)
committerJoshua Colp <jcolp@digium.com>
Wed, 14 Sep 2016 17:58:10 +0000 (12:58 -0500)
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

main/codec_builtin.c
res/res_rtp_asterisk.c

index facb5a84ca88b4e99c606dc929cd6582ae162147..1f2cb9270478f5952b116b49fcefd1615fb5ad32 100644 (file)
@@ -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 = {
index a8d4a90775bd5f716d0745c1fdcb893b6152481c..d6eea3ce0d7f7cf1e1bd5e276021ee4f57a40262 100644 (file)
@@ -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;