[Red5devs] [Red5] #93: Subscriber stream timestamps are wrong compared to FMS

Red5 System
Wed Jul 26 03:46:53 EDT 2006


#93: Subscriber stream timestamps are wrong compared to FMS
-----------------------------------------------------+----------------------
Reporter:  Christian Eckerle <ce at publishing-etc.de>  |       Owner:  Steven Gong
    Type:  bug                                       |      Status:  new        
Priority:  normal                                    |   Component:  Streaming  
 Version:  0.5                                       |    Severity:  normal     
Keywords:                                            |  
-----------------------------------------------------+----------------------
 FMS adjusts the timestamp on first audio packet of a subscriber stream to
 zero. The following first    video is adjusted by the same difference. The
 same should probably happen if the video packet comes first. All following
 packets are sent out with their original realtive timestamp intact.

 The following captures show the different behavior:

 {{{
 -> A: audio fragment from client
 <- A: audio fragment from server
 -> V: video fragment from client
 <- V: video fragment from server

 FMS 2:
 -> A fragment 21 time 1152869643161,987061 timestamp 1910
 <- A fragment 22 time 1152869643162,256104 timestamp 0
 <- A fragment 23 time 1152869643162,256104 timestamp 0
 -> A fragment 24 time 1152869643193,319092 timestamp 32
 <- A fragment 25 time 1152869643193,503906 timestamp 32
 -> A fragment 26 time 1152869643226,375977 timestamp 32
 <- A fragment 27 time 1152869643226,599121 timestamp 32
 -> A fragment 28 time 1152869643257,750000 timestamp 32
 <- A fragment 29 time 1152869643257,917969 timestamp 32
 -> A fragment 30 time 1152869643290,842041 timestamp 33
 <- A fragment 31 time 1152869643291,049072 timestamp 33
 -> A fragment 32 time 1152869643322,204102 timestamp 32
 <- A fragment 33 time 1152869643322,395020 timestamp 32
 -> A fragment 34 time 1152869643355,324951 timestamp 32
 <- A fragment 35 time 1152869643355,497070 timestamp 32
 -> A fragment 36 time 1152869643386,673096 timestamp 32
 <- A fragment 37 time 1152869643386,878906 timestamp 32
 -> A fragment 38 time 1152869643419,795898 timestamp 33
 <- A fragment 39 time 1152869643419,966064 timestamp 33
 -> A fragment 40 time 1152869643451,104004 timestamp 32
 <- A fragment 41 time 1152869643451,304932 timestamp 32
 -> A fragment 42 time 1152869643483,368896 timestamp 32
 <- A fragment 43 time 1152869643483,543945 timestamp 32
 -> A fragment 44 time 1152869643516,439941 timestamp 32
 <- A fragment 45 time 1152869643516,612061 timestamp 32
 -> A fragment 46 time 1152869643547,791992 timestamp 32
 <- A fragment 47 time 1152869643547,999023 timestamp 32
 -> A fragment 48 time 1152869643569,310059 timestamp 32
 <- A fragment 49 time 1152869643569,479980 timestamp 32
 -> A fragment 50 time 1152869643612,283936 timestamp 32
 <- A fragment 51 time 1152869643612,458984 timestamp 32
 -> A fragment 52 time 1152869643645,343994 timestamp 33
 <- A fragment 53 time 1152869643645,516113 timestamp 33
 -> A fragment 54 time 1152869643677,647949 timestamp 32
 <- A fragment 55 time 1152869643677,835938 timestamp 32
 -> V fragment 56 time 1152869643696,603027 timestamp 2444
 -> V fragment 56 time 1152869643696,603027 timestamp 2444
 -> V fragment 56 time 1152869643696,603027 timestamp 2444
 -> V fragment 56 time 1152869643696,603027 timestamp 2444
 -> V fragment 56 time 1152869643696,603027 timestamp 2444
 -> V fragment 56 time 1152869643696,603027 timestamp 2444
 -> V fragment 56 time 1152869643696,603027 timestamp 2444
 -> V fragment 56 time 1152869643696,603027 timestamp 2444
 -> V fragment 56 time 1152869643696,603027 timestamp 2444
 -> V fragment 56 time 1152869643696,603027 timestamp 2444
 -> V fragment 56 time 1152869643696,603027 timestamp 2444
 -> V fragment 56 time 1152869643696,603027 timestamp 2444
 -> V fragment 56 time 1152869643696,603027 timestamp 2444
 -> V fragment 56 time 1152869643696,603027 timestamp 2444
 -> V fragment 56 time 1152869643696,603027 timestamp 2444
 -> V fragment 56 time 1152869643696,603027 timestamp 2444
 -> V fragment 56 time 1152869643696,603027 timestamp 2444
 -> V fragment 56 time 1152869643696,603027 timestamp 2444
 -> V fragment 56 time 1152869643696,603027 timestamp 2444
 -> V fragment 56 time 1152869643696,603027 timestamp 2444
 -> V fragment 56 time 1152869643696,603027 timestamp 2444
 -> V fragment 56 time 1152869643696,603027 timestamp 2444
 -> V fragment 56 time 1152869643696,603027 timestamp 2444
 -> V fragment 56 time 1152869643696,603027 timestamp 2444
 -> V fragment 56 time 1152869643696,603027 timestamp 2444
 -> V fragment 56 time 1152869643696,603027 timestamp 2444
 -> V fragment 56 time 1152869643696,603027 timestamp 2444
 -> V fragment 56 time 1152869643696,603027 timestamp 2444
 -> V fragment 56 time 1152869643696,603027 timestamp 2444
 -> V fragment 56 time 1152869643696,603027 timestamp 2444
 -> V fragment 56 time 1152869643696,603027 timestamp 2444
 -> V fragment 56 time 1152869643696,781006 timestamp 2444
 -> V fragment 56 time 1152869643696,781006 timestamp 2444
 -> V fragment 56 time 1152869643696,781006 timestamp 2444
 -> V fragment 56 time 1152869643696,781006 timestamp 2444
 -> V fragment 56 time 1152869643696,781006 timestamp 2444
 -> V fragment 56 time 1152869643696,781006 timestamp 2444
 -> V fragment 56 time 1152869643696,781006 timestamp 2444
 -> V fragment 56 time 1152869643696,781006 timestamp 2444
 -> V fragment 56 time 1152869643696,781006 timestamp 2444
 -> V fragment 56 time 1152869643696,781006 timestamp 2444
 -> V fragment 56 time 1152869643696,781006 timestamp 2444
 -> V fragment 56 time 1152869643696,781006 timestamp 2444
 -> V fragment 56 time 1152869643696,781006 timestamp 2444
 -> V fragment 56 time 1152869643696,781006 timestamp 2444
 -> V fragment 56 time 1152869643696,781006 timestamp 2444
 -> V fragment 56 time 1152869643696,781006 timestamp 2444
 <- V fragment 57 time 1152869643697,965088 timestamp 534
 <- V fragment 57 time 1152869643697,965088 timestamp 534
 <- V fragment 57 time 1152869643697,965088 timestamp 534
 <- V fragment 57 time 1152869643697,965088 timestamp 534
 <- V fragment 57 time 1152869643697,965088 timestamp 534
 <- V fragment 57 time 1152869643697,965088 timestamp 534
 <- V fragment 57 time 1152869643697,965088 timestamp 534
 <- V fragment 57 time 1152869643697,965088 timestamp 534
 <- V fragment 57 time 1152869643697,965088 timestamp 534
 <- V fragment 57 time 1152869643697,965088 timestamp 534
 <- V fragment 57 time 1152869643697,965088 timestamp 534
 <- V fragment 57 time 1152869643698,086914 timestamp 534
 <- V fragment 57 time 1152869643698,086914 timestamp 534
 <- V fragment 57 time 1152869643698,086914 timestamp 534
 <- V fragment 57 time 1152869643698,086914 timestamp 534
 <- V fragment 57 time 1152869643698,086914 timestamp 534
 <- V fragment 57 time 1152869643698,086914 timestamp 534
 <- V fragment 57 time 1152869643698,086914 timestamp 534
 <- V fragment 57 time 1152869643698,086914 timestamp 534
 <- V fragment 57 time 1152869643698,086914 timestamp 534
 <- V fragment 57 time 1152869643698,086914 timestamp 534
 <- V fragment 57 time 1152869643698,086914 timestamp 534
 <- V fragment 57 time 1152869643698,202881 timestamp 534
 <- V fragment 57 time 1152869643698,202881 timestamp 534
 <- V fragment 57 time 1152869643698,202881 timestamp 534
 <- V fragment 57 time 1152869643698,202881 timestamp 534
 <- V fragment 57 time 1152869643698,202881 timestamp 534
 <- V fragment 57 time 1152869643698,202881 timestamp 534
 <- V fragment 57 time 1152869643698,202881 timestamp 534
 <- V fragment 57 time 1152869643698,202881 timestamp 534
 <- V fragment 57 time 1152869643698,202881 timestamp 534
 <- V fragment 57 time 1152869643698,202881 timestamp 534
 <- V fragment 57 time 1152869643698,202881 timestamp 534
 <- V fragment 57 time 1152869643698,331055 timestamp 534
 <- V fragment 57 time 1152869643698,331055 timestamp 534
 <- V fragment 57 time 1152869643698,331055 timestamp 534
 <- V fragment 57 time 1152869643698,331055 timestamp 534
 <- V fragment 57 time 1152869643698,331055 timestamp 534
 <- V fragment 57 time 1152869643698,331055 timestamp 534
 <- V fragment 57 time 1152869643698,331055 timestamp 534
 <- V fragment 57 time 1152869643698,331055 timestamp 534
 <- V fragment 57 time 1152869643698,331055 timestamp 534
 <- V fragment 57 time 1152869643698,331055 timestamp 534
 <- V fragment 57 time 1152869643698,331055 timestamp 534
 <- V fragment 57 time 1152869643698,331055 timestamp 534
 <- V fragment 57 time 1152869643698,343018 timestamp 534
 <- V fragment 57 time 1152869643698,343018 timestamp 534
 -> A fragment 58 time 1152869643709,791016 timestamp 33
 <- A fragment 59 time 1152869643709,958984 timestamp 33
 -> A fragment 60 time 1152869643731,280029 timestamp 32
 <- A fragment 61 time 1152869643731,451904 timestamp 32
 -> A fragment 62 time 1152869643774,256104 timestamp 32
 <- A fragment 63 time 1152869643774,483887 timestamp 32
 -> A fragment 64 time 1152869643814,105957 timestamp 39
 <- A fragment 65 time 1152869643814,500977 timestamp 39
 -> V fragment 66 time 1152869643825,924072 timestamp 129
 -> V fragment 66 time 1152869643825,924072 timestamp 129
 -> V fragment 66 time 1152869643825,924072 timestamp 129
 -> V fragment 66 time 1152869643825,924072 timestamp 129
 -> V fragment 66 time 1152869643825,924072 timestamp 129
 -> V fragment 66 time 1152869643825,924072 timestamp 129
 -> V fragment 66 time 1152869643825,924072 timestamp 129
 -> V fragment 66 time 1152869643825,924072 timestamp 129
 -> V fragment 66 time 1152869643825,924072 timestamp 129
 -> V fragment 66 time 1152869643825,924072 timestamp 129
 -> V fragment 66 time 1152869643825,924072 timestamp 129
 -> V fragment 66 time 1152869643825,924072 timestamp 129
 -> V fragment 66 time 1152869643825,924072 timestamp 129
 -> V fragment 66 time 1152869643825,924072 timestamp 129
 -> V fragment 66 time 1152869643825,924072 timestamp 129
 -> V fragment 66 time 1152869643825,924072 timestamp 129
 -> V fragment 66 time 1152869643825,924072 timestamp 129
 -> V fragment 66 time 1152869643825,924072 timestamp 129
 -> V fragment 66 time 1152869643825,924072 timestamp 129
 -> V fragment 66 time 1152869643825,924072 timestamp 129
 -> V fragment 66 time 1152869643825,924072 timestamp 129
 -> V fragment 66 time 1152869643825,924072 timestamp 129
 -> V fragment 66 time 1152869643825,924072 timestamp 129
 -> V fragment 66 time 1152869643825,924072 timestamp 129
 -> V fragment 66 time 1152869643825,924072 timestamp 129
 -> V fragment 66 time 1152869643825,924072 timestamp 129
 -> V fragment 66 time 1152869643825,924072 timestamp 129
 -> V fragment 66 time 1152869643825,924072 timestamp 129
 -> V fragment 66 time 1152869643825,924072 timestamp 129
 -> V fragment 66 time 1152869643825,924072 timestamp 129
 -> V fragment 66 time 1152869643825,924072 timestamp 129
 -> V fragment 66 time 1152869643826,033936 timestamp 129
 -> V fragment 66 time 1152869643826,033936 timestamp 129
 -> V fragment 66 time 1152869643826,033936 timestamp 129
 -> V fragment 66 time 1152869643826,033936 timestamp 129
 -> V fragment 66 time 1152869643826,033936 timestamp 129
 -> V fragment 66 time 1152869643826,033936 timestamp 129
 -> V fragment 66 time 1152869643826,033936 timestamp 129
 <- V fragment 67 time 1152869643827,278076 timestamp 129
 <- V fragment 67 time 1152869643827,278076 timestamp 129
 <- V fragment 67 time 1152869643827,278076 timestamp 129
 <- V fragment 67 time 1152869643827,278076 timestamp 129
 <- V fragment 67 time 1152869643827,278076 timestamp 129
 <- V fragment 67 time 1152869643827,278076 timestamp 129
 <- V fragment 67 time 1152869643827,278076 timestamp 129
 <- V fragment 67 time 1152869643827,278076 timestamp 129
 <- V fragment 67 time 1152869643827,278076 timestamp 129
 <- V fragment 67 time 1152869643827,278076 timestamp 129
 <- V fragment 67 time 1152869643827,278076 timestamp 129
 <- V fragment 67 time 1152869643827,402100 timestamp 129
 <- V fragment 67 time 1152869643827,402100 timestamp 129
 <- V fragment 67 time 1152869643827,402100 timestamp 129
 <- V fragment 67 time 1152869643827,402100 timestamp 129
 <- V fragment 67 time 1152869643827,402100 timestamp 129
 <- V fragment 67 time 1152869643827,402100 timestamp 129
 <- V fragment 67 time 1152869643827,402100 timestamp 129
 <- V fragment 67 time 1152869643827,402100 timestamp 129
 <- V fragment 67 time 1152869643827,402100 timestamp 129
 <- V fragment 67 time 1152869643827,402100 timestamp 129
 <- V fragment 67 time 1152869643827,402100 timestamp 129
 <- V fragment 67 time 1152869643827,527100 timestamp 129
 <- V fragment 67 time 1152869643827,527100 timestamp 129
 <- V fragment 67 time 1152869643827,527100 timestamp 129
 <- V fragment 67 time 1152869643827,527100 timestamp 129
 <- V fragment 67 time 1152869643827,527100 timestamp 129
 <- V fragment 67 time 1152869643827,527100 timestamp 129
 <- V fragment 67 time 1152869643827,527100 timestamp 129
 <- V fragment 67 time 1152869643827,527100 timestamp 129
 <- V fragment 67 time 1152869643827,527100 timestamp 129
 <- V fragment 67 time 1152869643827,527100 timestamp 129
 <- V fragment 67 time 1152869643827,527100 timestamp 129
 <- V fragment 67 time 1152869643827,568115 timestamp 129
 <- V fragment 67 time 1152869643827,568115 timestamp 129
 <- V fragment 67 time 1152869643827,568115 timestamp 129
 <- V fragment 67 time 1152869643827,568115 timestamp 129
 <- V fragment 67 time 1152869643827,568115 timestamp 129


 Red5:
 <- A fragment 16 time 1152869213005,730957 timestamp 0
 -> A fragment 19 time 1152869214585,610107 timestamp 1811
 <- A fragment 20 time 1152869214586,127930 timestamp 1810
 -> A fragment 21 time 1152869214618,653076 timestamp 33
 <- A fragment 22 time 1152869214618,959961 timestamp 32
 -> A fragment 23 time 1152869214650,016113 timestamp 32
 <- A fragment 24 time 1152869214650,291016 timestamp 31
 -> A fragment 25 time 1152869214683,104980 timestamp 33
 <- A fragment 26 time 1152869214683,409912 timestamp 32
 -> A fragment 27 time 1152869214714,516113 timestamp 32
 <- A fragment 28 time 1152869214714,899902 timestamp 32
 -> A fragment 29 time 1152869214747,547119 timestamp 32
 <- A fragment 30 time 1152869214747,819092 timestamp 31
 -> A fragment 31 time 1152869214779,063965 timestamp 32
 <- A fragment 32 time 1152869214779,305908 timestamp 30
 -> A fragment 33 time 1152869214812,037109 timestamp 32
 <- A fragment 34 time 1152869214812,419922 timestamp 29
 -> A fragment 35 time 1152869214843,376953 timestamp 32
 <- A fragment 36 time 1152869214843,658936 timestamp 28
 -> A fragment 37 time 1152869214876,458984 timestamp 33
 <- A fragment 38 time 1152869214876,761963 timestamp 33
 -> A fragment 39 time 1152869214907,893066 timestamp 32
 <- A fragment 40 time 1152869214908,194092 timestamp 31
 -> A fragment 41 time 1152869214940,928955 timestamp 32
 <- A fragment 42 time 1152869214941,225098 timestamp 30
 -> A fragment 43 time 1152869214972,289062 timestamp 32
 <- A fragment 44 time 1152869214972,572998 timestamp 29
 -> A fragment 45 time 1152869214993,822021 timestamp 32
 <- A fragment 46 time 1152869214994,115967 timestamp 28
 -> A fragment 47 time 1152869215036,750000 timestamp 32
 <- A fragment 48 time 1152869215037,013916 timestamp 28
 -> A fragment 49 time 1152869215069,827881 timestamp 33
 <- A fragment 50 time 1152869215070,123047 timestamp 32
 -> A fragment 51 time 1152869215102,072998 timestamp 32
 <- A fragment 52 time 1152869215102,446045 timestamp 31
 -> V fragment 53 time 1152869215121,386963 timestamp 2346
 -> V fragment 53 time 1152869215121,386963 timestamp 2346
 -> V fragment 53 time 1152869215121,386963 timestamp 2346
 -> V fragment 53 time 1152869215121,386963 timestamp 2346
 -> V fragment 53 time 1152869215121,386963 timestamp 2346
 -> V fragment 53 time 1152869215121,386963 timestamp 2346
 -> V fragment 53 time 1152869215121,386963 timestamp 2346
 -> V fragment 53 time 1152869215121,386963 timestamp 2346
 -> V fragment 53 time 1152869215121,386963 timestamp 2346
 -> V fragment 53 time 1152869215121,386963 timestamp 2346
 -> V fragment 53 time 1152869215121,386963 timestamp 2346
 -> V fragment 53 time 1152869215121,386963 timestamp 2346
 -> V fragment 53 time 1152869215121,386963 timestamp 2346
 -> V fragment 53 time 1152869215121,386963 timestamp 2346
 -> V fragment 53 time 1152869215121,386963 timestamp 2346
 -> V fragment 53 time 1152869215121,386963 timestamp 2346
 -> V fragment 53 time 1152869215121,386963 timestamp 2346
 -> V fragment 53 time 1152869215121,386963 timestamp 2346
 -> V fragment 53 time 1152869215121,386963 timestamp 2346
 -> V fragment 53 time 1152869215121,386963 timestamp 2346
 -> V fragment 53 time 1152869215121,386963 timestamp 2346
 -> V fragment 53 time 1152869215121,386963 timestamp 2346
 -> V fragment 53 time 1152869215121,386963 timestamp 2346
 -> V fragment 53 time 1152869215121,386963 timestamp 2346
 -> V fragment 53 time 1152869215121,386963 timestamp 2346
 -> V fragment 53 time 1152869215121,386963 timestamp 2346
 -> V fragment 53 time 1152869215121,386963 timestamp 2346
 -> V fragment 53 time 1152869215121,386963 timestamp 2346
 -> V fragment 53 time 1152869215121,386963 timestamp 2346
 -> V fragment 53 time 1152869215121,386963 timestamp 2346
 -> V fragment 53 time 1152869215121,386963 timestamp 2346
 -> V fragment 53 time 1152869215121,541016 timestamp 2346
 -> V fragment 53 time 1152869215121,541016 timestamp 2346
 -> V fragment 53 time 1152869215121,541016 timestamp 2346
 -> V fragment 53 time 1152869215121,541016 timestamp 2346
 -> V fragment 53 time 1152869215121,541016 timestamp 2346
 -> V fragment 53 time 1152869215121,541016 timestamp 2346
 -> V fragment 53 time 1152869215121,541016 timestamp 2346
 -> V fragment 53 time 1152869215121,541016 timestamp 2346
 -> V fragment 53 time 1152869215121,541016 timestamp 2346
 -> V fragment 53 time 1152869215121,541016 timestamp 2346
 -> V fragment 53 time 1152869215121,541016 timestamp 2346
 -> V fragment 53 time 1152869215121,541016 timestamp 2346
 -> V fragment 53 time 1152869215121,541016 timestamp 2346
 -> V fragment 53 time 1152869215121,541016 timestamp 2346
 -> V fragment 53 time 1152869215121,541016 timestamp 2346
 <- V fragment 54 time 1152869215124,216064 timestamp 4657
 <- V fragment 54 time 1152869215124,216064 timestamp 4657
 <- V fragment 54 time 1152869215124,216064 timestamp 4657
 <- V fragment 54 time 1152869215124,216064 timestamp 4657
 <- V fragment 54 time 1152869215124,216064 timestamp 4657
 <- V fragment 54 time 1152869215124,216064 timestamp 4657
 <- V fragment 54 time 1152869215124,216064 timestamp 4657
 <- V fragment 54 time 1152869215124,216064 timestamp 4657
 <- V fragment 54 time 1152869215124,216064 timestamp 4657
 <- V fragment 54 time 1152869215124,216064 timestamp 4657
 <- V fragment 54 time 1152869215124,216064 timestamp 4657
 <- V fragment 54 time 1152869215124,332031 timestamp 4657
 <- V fragment 54 time 1152869215124,332031 timestamp 4657
 <- V fragment 54 time 1152869215124,332031 timestamp 4657
 <- V fragment 54 time 1152869215124,332031 timestamp 4657
 <- V fragment 54 time 1152869215124,332031 timestamp 4657
 <- V fragment 54 time 1152869215124,332031 timestamp 4657
 <- V fragment 54 time 1152869215124,332031 timestamp 4657
 <- V fragment 54 time 1152869215124,332031 timestamp 4657
 <- V fragment 54 time 1152869215124,332031 timestamp 4657
 <- V fragment 54 time 1152869215124,332031 timestamp 4657
 <- V fragment 54 time 1152869215124,332031 timestamp 4657
 <- V fragment 54 time 1152869215124,458008 timestamp 4657
 <- V fragment 54 time 1152869215124,458008 timestamp 4657
 <- V fragment 54 time 1152869215124,458008 timestamp 4657
 <- V fragment 54 time 1152869215124,458008 timestamp 4657
 <- V fragment 54 time 1152869215124,458008 timestamp 4657
 <- V fragment 54 time 1152869215124,458008 timestamp 4657
 <- V fragment 54 time 1152869215124,458008 timestamp 4657
 <- V fragment 54 time 1152869215124,458008 timestamp 4657
 <- V fragment 54 time 1152869215124,458008 timestamp 4657
 <- V fragment 54 time 1152869215124,458008 timestamp 4657
 <- V fragment 54 time 1152869215124,458008 timestamp 4657
 <- V fragment 54 time 1152869215124,752930 timestamp 4657
 <- V fragment 54 time 1152869215124,752930 timestamp 4657
 <- V fragment 54 time 1152869215124,752930 timestamp 4657
 <- V fragment 54 time 1152869215124,752930 timestamp 4657
 <- V fragment 54 time 1152869215124,752930 timestamp 4657
 <- V fragment 54 time 1152869215124,752930 timestamp 4657
 <- V fragment 54 time 1152869215124,752930 timestamp 4657
 <- V fragment 54 time 1152869215124,752930 timestamp 4657
 <- V fragment 54 time 1152869215124,752930 timestamp 4657
 <- V fragment 54 time 1152869215124,752930 timestamp 4657
 <- V fragment 54 time 1152869215124,752930 timestamp 4657
 <- V fragment 54 time 1152869215124,752930 timestamp 4657
 <- V fragment 54 time 1152869215124,761963 timestamp 4657
 -> A fragment 55 time 1152869215134,284912 timestamp 33
 <- A fragment 56 time 1152869215134,576904 timestamp 32
 -> A fragment 57 time 1152869215163,657959 timestamp 32
 <- A fragment 58 time 1152869215163,904053 timestamp 31
 -> A fragment 59 time 1152869215199,487061 timestamp 32
 <- A fragment 60 time 1152869215199,867920 timestamp 31
 -> A fragment 61 time 1152869215235,707031 timestamp 36
 <- A fragment 62 time 1152869215236,054932 timestamp 35
 -> A fragment 63 time 1152869215263,358887 timestamp 32
 <- A fragment 64 time 1152869215263,738037 timestamp 31
 -> A fragment 65 time 1152869215284,674072 timestamp 32
 <- A fragment 66 time 1152869215284,927002 timestamp 30
 -> V fragment 67 time 1152869215307,400879 timestamp 201
 -> V fragment 67 time 1152869215307,400879 timestamp 201
 -> V fragment 67 time 1152869215307,400879 timestamp 201
 -> V fragment 67 time 1152869215307,400879 timestamp 201
 -> V fragment 67 time 1152869215307,400879 timestamp 201
 -> V fragment 67 time 1152869215307,400879 timestamp 201
 -> V fragment 67 time 1152869215307,400879 timestamp 201
 -> V fragment 67 time 1152869215307,400879 timestamp 201
 -> V fragment 67 time 1152869215307,400879 timestamp 201
 -> V fragment 67 time 1152869215307,400879 timestamp 201
 -> V fragment 67 time 1152869215307,400879 timestamp 201
 -> V fragment 67 time 1152869215307,400879 timestamp 201
 -> V fragment 67 time 1152869215307,400879 timestamp 201
 -> V fragment 67 time 1152869215307,400879 timestamp 201
 -> V fragment 67 time 1152869215307,400879 timestamp 201
 -> V fragment 67 time 1152869215307,400879 timestamp 201
 -> V fragment 67 time 1152869215307,400879 timestamp 201
 -> V fragment 67 time 1152869215307,400879 timestamp 201
 -> V fragment 67 time 1152869215307,400879 timestamp 201
 -> V fragment 67 time 1152869215307,400879 timestamp 201
 -> V fragment 67 time 1152869215307,400879 timestamp 201
 -> V fragment 67 time 1152869215307,400879 timestamp 201
 -> V fragment 67 time 1152869215307,400879 timestamp 201
 -> V fragment 67 time 1152869215307,400879 timestamp 201
 -> V fragment 67 time 1152869215307,400879 timestamp 201
 -> V fragment 67 time 1152869215307,400879 timestamp 201
 -> V fragment 67 time 1152869215307,400879 timestamp 201
 -> V fragment 67 time 1152869215307,400879 timestamp 201
 -> V fragment 67 time 1152869215307,400879 timestamp 201
 -> V fragment 67 time 1152869215307,400879 timestamp 201
 -> V fragment 67 time 1152869215307,400879 timestamp 201
 -> V fragment 67 time 1152869215307,498047 timestamp 201
 -> V fragment 67 time 1152869215307,498047 timestamp 201
 -> V fragment 67 time 1152869215307,498047 timestamp 201
 -> V fragment 67 time 1152869215307,498047 timestamp 201
 -> V fragment 67 time 1152869215307,498047 timestamp 201
 -> V fragment 67 time 1152869215307,498047 timestamp 201
 -> V fragment 67 time 1152869215307,498047 timestamp 201
 -> V fragment 67 time 1152869215307,498047 timestamp 201
 -> A fragment 68 time 1152869215316,939941 timestamp 32
 -> V fragment 67 time 1152869215316,939941 timestamp 201
 -> V fragment 67 time 1152869215316,939941 timestamp 201
 <- A fragment 69 time 1152869215317,256104 timestamp 29
 -> A fragment 70 time 1152869215364,099121 timestamp 33
 <- A fragment 71 time 1152869215364,358887 timestamp 33
 -> A fragment 72 time 1152869215391,639893 timestamp 32
 <- A fragment 73 time 1152869215391,916016 timestamp 31
 -> A fragment 74 time 1152869215436,632080 timestamp 40
 <- A fragment 75 time 1152869215436,909912 timestamp 39
 -> A fragment 76 time 1152869215445,822998 timestamp 32
 <- A fragment 77 time 1152869215446,044922 timestamp 31
 -> V fragment 78 time 1152869215463,510010 timestamp 164
 -> V fragment 78 time 1152869215463,510010 timestamp 164
 -> V fragment 78 time 1152869215463,510010 timestamp 164
 -> V fragment 78 time 1152869215463,510010 timestamp 164
 -> V fragment 78 time 1152869215463,510010 timestamp 164
 -> V fragment 78 time 1152869215463,510010 timestamp 164
 -> V fragment 78 time 1152869215463,510010 timestamp 164
 -> V fragment 78 time 1152869215463,510010 timestamp 164
 -> V fragment 78 time 1152869215463,510010 timestamp 164
 -> V fragment 78 time 1152869215463,510010 timestamp 164
 -> V fragment 78 time 1152869215463,510010 timestamp 164
 -> V fragment 78 time 1152869215463,510010 timestamp 164
 -> V fragment 78 time 1152869215463,510010 timestamp 164
 -> V fragment 78 time 1152869215463,510010 timestamp 164
 -> V fragment 78 time 1152869215463,510010 timestamp 164
 -> V fragment 78 time 1152869215463,510010 timestamp 164
 -> V fragment 78 time 1152869215463,510010 timestamp 164
 -> V fragment 78 time 1152869215463,510010 timestamp 164
 -> V fragment 78 time 1152869215463,510010 timestamp 164
 -> V fragment 78 time 1152869215463,510010 timestamp 164
 -> V fragment 78 time 1152869215463,510010 timestamp 164
 -> V fragment 78 time 1152869215463,510010 timestamp 164
 -> V fragment 78 time 1152869215463,510010 timestamp 164
 -> V fragment 78 time 1152869215463,510010 timestamp 164
 -> V fragment 78 time 1152869215463,510010 timestamp 164
 -> V fragment 78 time 1152869215463,510010 timestamp 164
 -> V fragment 78 time 1152869215463,510010 timestamp 164
 -> V fragment 78 time 1152869215463,510010 timestamp 164
 -> V fragment 78 time 1152869215463,510010 timestamp 164
 -> V fragment 78 time 1152869215463,510010 timestamp 164
 -> V fragment 78 time 1152869215463,510010 timestamp 164
 -> V fragment 78 time 1152869215477,334961 timestamp 164
 -> A fragment 79 time 1152869215477,334961 timestamp 32
 -> V fragment 78 time 1152869215477,334961 timestamp 164
 -> V fragment 78 time 1152869215477,334961 timestamp 164
 -> V fragment 78 time 1152869215477,334961 timestamp 164
 -> V fragment 78 time 1152869215477,334961 timestamp 164
 -> V fragment 78 time 1152869215477,334961 timestamp 164
 -> V fragment 78 time 1152869215477,334961 timestamp 164
 -> V fragment 78 time 1152869215477,334961 timestamp 164
 -> V fragment 78 time 1152869215477,334961 timestamp 164
 -> V fragment 78 time 1152869215477,334961 timestamp 164
 -> V fragment 78 time 1152869215477,334961 timestamp 164
 -> V fragment 78 time 1152869215477,334961 timestamp 164
 -> V fragment 78 time 1152869215477,334961 timestamp 164
 -> V fragment 78 time 1152869215477,334961 timestamp 164
 -> V fragment 78 time 1152869215477,334961 timestamp 164
 <- A fragment 80 time 1152869215477,884033 timestamp 30
 <- V fragment 81 time 1152869215478,259033 timestamp 164
 <- V fragment 81 time 1152869215478,259033 timestamp 164
 <- V fragment 81 time 1152869215478,259033 timestamp 164
 <- V fragment 81 time 1152869215478,259033 timestamp 164
 <- V fragment 81 time 1152869215478,259033 timestamp 164
 <- V fragment 81 time 1152869215478,259033 timestamp 164
 <- V fragment 81 time 1152869215478,259033 timestamp 164
 <- V fragment 81 time 1152869215478,259033 timestamp 164
 <- V fragment 81 time 1152869215478,259033 timestamp 164
 <- V fragment 81 time 1152869215478,259033 timestamp 164
 <- V fragment 81 time 1152869215478,259033 timestamp 164
 <- V fragment 81 time 1152869215478,375977 timestamp 164
 <- V fragment 81 time 1152869215478,375977 timestamp 164
 <- V fragment 81 time 1152869215478,375977 timestamp 164
 <- V fragment 81 time 1152869215478,375977 timestamp 164
 <- V fragment 81 time 1152869215478,375977 timestamp 164
 <- V fragment 81 time 1152869215478,375977 timestamp 164
 <- V fragment 81 time 1152869215478,375977 timestamp 164
 <- V fragment 81 time 1152869215478,375977 timestamp 164
 <- V fragment 81 time 1152869215478,375977 timestamp 164
 <- V fragment 81 time 1152869215478,375977 timestamp 164
 <- V fragment 81 time 1152869215478,375977 timestamp 164
 <- V fragment 81 time 1152869215478,501953 timestamp 164
 <- V fragment 81 time 1152869215478,501953 timestamp 164
 <- V fragment 81 time 1152869215478,501953 timestamp 164
 <- V fragment 81 time 1152869215478,501953 timestamp 164
 <- V fragment 81 time 1152869215478,501953 timestamp 164
 <- V fragment 81 time 1152869215478,501953 timestamp 164
 <- V fragment 81 time 1152869215478,501953 timestamp 164
 <- V fragment 81 time 1152869215478,501953 timestamp 164
 <- V fragment 81 time 1152869215478,501953 timestamp 164
 <- V fragment 81 time 1152869215478,501953 timestamp 164
 <- V fragment 81 time 1152869215478,501953 timestamp 164
 <- V fragment 81 time 1152869215478,888916 timestamp 164
 <- V fragment 81 time 1152869215478,888916 timestamp 164
 <- V fragment 81 time 1152869215478,888916 timestamp 164
 <- V fragment 81 time 1152869215478,888916 timestamp 164
 <- V fragment 81 time 1152869215478,888916 timestamp 164
 <- V fragment 81 time 1152869215478,888916 timestamp 164
 <- V fragment 81 time 1152869215478,888916 timestamp 164
 <- V fragment 81 time 1152869215478,888916 timestamp 164
 <- V fragment 81 time 1152869215478,888916 timestamp 164
 <- V fragment 81 time 1152869215478,888916 timestamp 164
 <- V fragment 81 time 1152869215478,888916 timestamp 164
 <- V fragment 81 time 1152869215478,888916 timestamp 164
 <- V fragment 81 time 1152869215478,897949 timestamp 164
 }}}

 The following patch is a first attempt to get the same results from Red5.
 Interaction with multiple play list items and flow control is probably not
 right.

 {{{
 Index:
 /home/ce/Documents/workspace/Red5_trunk/src/org/red5/server/stream/ClientBroadcastStream.java
 ===================================================================
 ---
 /home/ce/Documents/workspace/Red5_trunk/src/org/red5/server/stream/ClientBroadcastStream.java
 (revision 1203)
 +++
 /home/ce/Documents/workspace/Red5_trunk/src/org/red5/server/stream/ClientBroadcastStream.java
 (working copy)
 @@ -74,10 +74,6 @@
         private IPipe recordPipe;
         private boolean sendStartNotification = true;

 -       private long startTime;
 -       private long lastAudio;
 -       private long lastVideo;
 -       private long lastData;
         private int chunkSize = 0;

         public void start() {
 @@ -94,10 +90,8 @@
                 Map<Object, Object> recordParamMap = new HashMap<Object,
 Object>();
                 recordParamMap.put("record", null);
                 recordPipe.subscribe((IProvider) this, recordParamMap);
 -               startTime = System.currentTimeMillis();
                 setCodecInfo(new StreamCodecInfo());
                 sendStartNotify();
 -               lastAudio = lastVideo = lastData = startTime;
                 notifyBroadcastStart();
         }

 @@ -186,12 +180,6 @@
                 }
         }

 -       private int videoCounter = 0;
 -       private int audioCounter = 0;
 -       private long totalAudio = 0;
 -       private long totalVideo = 0;
 -       private int timerAdd = 0;
 -
         public void dispatchEvent(IEvent event) {
                 if (!(event instanceof IRTMPEvent) && (event.getType() !=
 IEvent.Type.STREAM_CONTROL) && (event.getType() !=
 IEvent.Type.STREAM_DATA))
                         return;
 @@ -202,18 +190,9 @@
                         streamCodec = (StreamCodecInfo) codecInfo;

                 IRTMPEvent rtmpEvent = (IRTMPEvent) event;
 -               long delta = 0;
 -               long now = System.currentTimeMillis();
                 if (rtmpEvent instanceof AudioData) {
                         if (streamCodec != null)
                                 streamCodec.setHasAudio(true);
 -                       delta = now - lastAudio;
 -                       lastAudio = now;
 -                       IEventListener source = event.getSource();
 -                       if (rtmpEvent.getHeader().isTimerRelative())
 -                               totalAudio += rtmpEvent.getTimestamp();
 -                       else
 -                               totalAudio = rtmpEvent.getTimestamp();
                 } else if (rtmpEvent instanceof VideoData) {
                         IVideoStreamCodec videoStreamCodec = null;
                         if (videoCodecFactory != null && checkVideoCodec)
 {
 @@ -230,12 +209,6 @@

                         if (streamCodec != null)
                                 streamCodec.setHasVideo(true);
 -                       delta = now - lastVideo;
 -                       lastVideo = now;
 -                       if (rtmpEvent.getHeader().isTimerRelative())
 -                               totalVideo += rtmpEvent.getTimestamp();
 -                       else
 -                               totalVideo = rtmpEvent.getTimestamp();
                         IEventListener source = event.getSource();
                         if (sendStartNotification) {
                                 // Notify handler that stream starts
 publishing
 @@ -249,48 +222,11 @@
                                         }
                                 }
                         }
 -               } else {
 -                       delta = now - lastData;
 -                       lastData = now;
                 }

 -               // XXX: deltas for the different tag types don't seem to
 work, investigate!
 -               delta = now - startTime;
 -               startTime = now;
 -
 -               //System.err.println("Input:  Audio " + totalAudio + ",
 Video " + totalVideo + ", Diff " + (totalAudio - totalVideo));
 -               //rtmpEvent.setTimestamp((int) delta);
                 RTMPMessage msg = new RTMPMessage();
                 msg.setBody(rtmpEvent);
 -               if (livePipe != null) {
 -                       // XXX probable race condition here
 -                       boolean send = true;
 -                       if (rtmpEvent instanceof VideoData) {
 -                               // Drop 1 in every 20 disposable
 interframe video packets, low tech lag fix.
 -                               VideoData.FrameType frameType =
 ((VideoData) rtmpEvent).getFrameType();
 -                               if (frameType ==
 VideoData.FrameType.DISPOSABLE_INTERFRAME) {
 -                                       send = (videoCounter++ % 20) != 0;
 -                                       timerAdd +=
 rtmpEvent.getTimestamp();
 -                               }
 -
 -                               /*
 -                               if (send && timerAdd > 0) {
 -                                       // Adjust timestamp with
 previously skipped frame
 -                                       // TODO: check if this increases
 lag again...
 -
 rtmpEvent.setTimestamp(rtmpEvent.getTimestamp() + timerAdd);
 -                                       timerAdd = 0;
 -                               }
 -                               */
 -                       } else if (rtmpEvent instanceof AudioData) {
 -                               // Low-tech audio lag fix, decrement
 timestamp by 1 in 4 of 5 audio packets
 -                               if (audioCounter > 0 && audioCounter % 5
 != 0 && rtmpEvent.getTimestamp() > 0) {
 -
 rtmpEvent.setTimestamp(rtmpEvent.getTimestamp() - 1);
 -                               }
 -                               audioCounter++;
 -                       }
 -                       if (send)
 -                               livePipe.pushMessage(msg);
 -               }
 +               if (livePipe != null) livePipe.pushMessage(msg);
                 recordPipe.pushMessage(msg);
         }

 Index:
 /home/ce/Documents/workspace/Red5_trunk/src/org/red5/server/stream/PlaylistSubscriberStream.java
 ===================================================================
 ---
 /home/ce/Documents/workspace/Red5_trunk/src/org/red5/server/stream/PlaylistSubscriberStream.java
 (revision 1227)
 +++
 /home/ce/Documents/workspace/Red5_trunk/src/org/red5/server/stream/PlaylistSubscriberStream.java
 (working copy)
 @@ -26,7 +26,6 @@

  import org.apache.commons.logging.Log;
  import org.apache.commons.logging.LogFactory;
 -import org.apache.mina.common.ByteBuffer;
  import org.red5.server.api.IBandwidthConfigure;
  import org.red5.server.api.IContext;
  import org.red5.server.api.IScope;
 @@ -535,6 +534,7 @@
                                 msgIn = liveInput;
                                 // Drop all frames up to the next keyframe
 videoFrameDropper.reset(IFrameDropper.SEND_KEYFRAMES_CHECK);
 +                               /*
                                 if (msgIn instanceof IBroadcastScope) {
                                         // Send initial keyframe
                                         IClientBroadcastStream stream =
 (IClientBroadcastStream) ((IBroadcastScope)
 msgIn).getAttribute(IBroadcastScope.STREAM_ATTRIBUTE);
 @@ -567,6 +567,7 @@
                                                 }
                                         }
                                 }
 +                               */
                                 msgIn.subscribe(this, null);
                                 if (item.getLength() >= 0) {
                                         playLengthJob =
 schedulingService.addScheduledOnceJob(item.getLength(), this);
 @@ -598,7 +599,7 @@
                         }
                         if (sendNotifications) {
                                 sendResetPing();
 -                               sendBlankAudio(0);
 +                               //sendBlankAudio(0);
                                 //sendBlankVideo(0);
                                 sendResetStatus(item);
                                 sendStartStatus(item);
 Index:
 /home/ce/Documents/workspace/Red5_trunk/src/org/red5/server/stream/consumer/ConnectionConsumer.java
 ===================================================================
 ---
 /home/ce/Documents/workspace/Red5_trunk/src/org/red5/server/stream/consumer/ConnectionConsumer.java
 (revision 1203)
 +++
 /home/ce/Documents/workspace/Red5_trunk/src/org/red5/server/stream/consumer/ConnectionConsumer.java
 (working copy)
 @@ -33,6 +33,7 @@
  import org.red5.server.net.rtmp.Channel;
  import org.red5.server.net.rtmp.RTMPConnection;
  import org.red5.server.net.rtmp.event.AudioData;
 +import org.red5.server.net.rtmp.event.BytesRead;
  import org.red5.server.net.rtmp.event.ChunkSize;
  import org.red5.server.net.rtmp.event.IRTMPEvent;
  import org.red5.server.net.rtmp.event.Notify;
 @@ -37,7 +38,6 @@
  import org.red5.server.net.rtmp.event.IRTMPEvent;
  import org.red5.server.net.rtmp.event.Notify;
  import org.red5.server.net.rtmp.event.Ping;
 -import org.red5.server.net.rtmp.event.BytesRead;
  import org.red5.server.net.rtmp.event.VideoData;
  import org.red5.server.net.rtmp.message.Constants;
  import org.red5.server.net.rtmp.message.Header;
 @@ -54,8 +54,9 @@
         private Channel video;
         private Channel audio;
         private Channel data;
 -       private int audioTime;
 -       private boolean videoReceived;
 +       private boolean videofirst=true;
 +       private boolean audiofirst=true;
 +       private int deltafirst=0;
         private int chunkSize = -1;

         public ConnectionConsumer(RTMPConnection conn, byte videoChannel,
 byte audioChannel, byte dataChannel) {
 @@ -63,13 +64,8 @@
                 this.video = conn.getChannel(videoChannel);
                 this.audio = conn.getChannel(audioChannel);
                 this.data = conn.getChannel(dataChannel);
 -               this.audioTime = 0;
 -               this.videoReceived = false;
         }

 -       private long totalAudio = 0;
 -       private long totalVideo = 0;
 -
         public void pushMessage(IPipe pipe, IMessage message) {
                 if (message instanceof StatusMessage) {
                         StatusMessage statusMsg = (StatusMessage) message;
 @@ -82,7 +78,6 @@
                                 msg.setHeader(new Header());
                         }
 msg.getHeader().setTimerRelative(rtmpMsg.isTimerRelative());
 -//                     log.debug("ts :" + msg.getTimestamp());
                         switch(msg.getDataType()){
                         case Constants.TYPE_STREAM_METADATA:
                                 Notify notify = new Notify(((Notify)
 msg).getData().asReadOnlyBuffer());
 @@ -89,10 +84,6 @@
                                 notify.setHeader(msg.getHeader());
                                 notify.setTimestamp(msg.getTimestamp());
                                 video.write(notify);
 -                               if (msg.getHeader().isTimerRelative())
 -                                       totalVideo += msg.getTimestamp();
 -                               else
 -                                       totalVideo = msg.getTimestamp();
                                 break;
                         case Constants.TYPE_VIDEO_DATA:
                                 VideoData videoData = new
 VideoData(((VideoData) msg).getData().asReadOnlyBuffer());
 @@ -97,20 +88,17 @@
                         case Constants.TYPE_VIDEO_DATA:
                                 VideoData videoData = new
 VideoData(((VideoData) msg).getData().asReadOnlyBuffer());
                                 videoData.setHeader(msg.getHeader());
 -                               if (audioTime > 0) {
 -
 msg.setTimestamp(msg.getTimestamp() + audioTime);
 -                                       if (msg.getTimestamp() < 0)
 -                                               msg.setTimestamp(0);
 -
 videoData.getHeader().setTimer(msg.getTimestamp());
 -                                       audioTime = 0;
 +
 videoData.setTimestamp(msg.getTimestamp());
 +                               if(videofirst && audiofirst) {
 +                                       videofirst=false;
 +
 deltafirst=videoData.getTimestamp();
 +                                       videoData.setTimestamp(0);
                                 }
 -
 videoData.setTimestamp(msg.getTimestamp());
 -                               videoReceived = true;
 +                               if(videofirst && !audiofirst) {
 +                                       videofirst=false;
 +
 videoData.setTimestamp(videoData.getTimestamp()-deltafirst);
 +                               }
                                 video.write(videoData);
 -                               if (msg.getHeader().isTimerRelative())
 -                                       totalVideo += msg.getTimestamp();
 -                               else
 -                                       totalVideo = msg.getTimestamp();
                                 break;
                         case Constants.TYPE_AUDIO_DATA:
                                 AudioData audioData = new
 AudioData(((AudioData) msg).getData().asReadOnlyBuffer());
 @@ -116,17 +104,19 @@
                                 AudioData audioData = new
 AudioData(((AudioData) msg).getData().asReadOnlyBuffer());
                                 audioData.setHeader(msg.getHeader());
 audioData.setTimestamp(msg.getTimestamp());
 +                               if(audiofirst && videofirst) {
 +                                       audiofirst=false;
 +
 deltafirst=audioData.getTimestamp();
 +                                       audioData.setTimestamp(0);
 +                                       AudioData blankAudio=new
 AudioData();
 +                                       blankAudio.setTimestamp(0);
 +                                       audio.write(blankAudio);
 +                               }
 +                               if(audiofirst && !videofirst) {
 +                                       audiofirst=false;
 +
 audioData.setTimestamp(audioData.getTimestamp()-deltafirst);
 +                               }
                                 audio.write(audioData);
 -                               if (!videoReceived)
 -                                       if
 (msg.getHeader().isTimerRelative())
 -                                               audioTime +=
 msg.getTimestamp();
 -                                       else
 -                                               audioTime =
 msg.getTimestamp();
 -
 -                               if (msg.getHeader().isTimerRelative())
 -                                       totalAudio += msg.getTimestamp();
 -                               else
 -                                       totalAudio = msg.getTimestamp();
                                 break;
                         case Constants.TYPE_PING:
                                 msg.getHeader().setTimerRelative(false);
 @@ -140,9 +130,8 @@
                                 break;
                         default:
                                 data.write(msg);
 -                       break;
 +                               break;
                         }
 -                       //System.err.println("Audio: " + totalAudio + ",
 Video: " + totalVideo + ", Diff: " + (totalAudio - totalVideo));
                 }
         }

 }}}

-- 
Ticket URL: <http://mirror1.cvsdude.com/trac/osflash/red5/ticket/93>
Red5 <http://osflash.org/red5>
Red5 Server


More information about the Red5devs mailing list