Hi Denia<br><br>On Tuesday, February 11, 2014, Denis Charmet <<a href="mailto:typx@dinauz.org">typx@dinauz.org</a>> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
---<br>
 modules/demux/Makefile.am |   3 +<br>
 modules/demux/mpeg/hevc.c | 349 ++++++++++++++++++++++++++++++++++++++++++++++<br>
 2 files changed, 352 insertions(+)<br>
 create mode 100644 modules/demux/mpeg/hevc.c<br>
<br><br>
+<br>
+<br>
+static void skipProfileTiersLevel( bs_t * bs, int32_t max_sub_layer_minus1 )<br>
+{<br>
+    uint8_t sub_layer_profile_present_flag[8];<br>
+    uint8_t sub_layer_level_present_flag[8];<br>
+<br>
+    /* skipping useless fields of the VPS see <a href="https://www.itu.int/rec/dologin_pub.asp?lang=e&id=T-REC-H.265-201304-I!!PDF-E&type=item" target="_blank">https://www.itu.int/rec/dologin_pub.asp?lang=e&id=T-REC-H.265-201304-I!!PDF-E&type=item</a> */<br>

+    bs_skip( bs, 2 + 1 + 5 + 32 + 1 + 1 + 1 + 1 + 44 + 8 );<br>
+<br>
+    for( int32_t i = 0; i < max_sub_layer_minus1; i++ )</blockquote><div><br></div><div>Shouldn't this be <= ?</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

+    {<br>
+        sub_layer_profile_present_flag[i] = bs_read1( bs );<br>
+        sub_layer_level_present_flag[i] = bs_read1( bs );<br>
+    }<br>
+<br>
+    if(max_sub_layer_minus1 > 0)<br>
+        bs_skip( bs, (8 - max_sub_layer_minus1) * 2 );<br>
+<br>
+    for( int32_t i = 0; i < max_sub_layer_minus1; i++ )</blockquote><div><br></div><div>Ditto</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+    {<br>
+        if( sub_layer_profile_present_flag[i] )<br>
+            bs_skip( bs, 2 + 1 + 5 + 32 + 1 + 1 + 1 + 1 + 44 );<br>
+        if( sub_layer_level_present_flag[i] )<br>
+            bs_skip( bs, 8 );<br>
+    }<br>
+}<br>
+<br>
+static uint32_t read_ue( bs_t * bs )<br>
+{<br>
+    int32_t i = 0;<br>
+<br>
+    while( bs_read1( bs ) == 0 && bs->p < bs->p_end && i < 32 )<br>
+        i++;<br>
+<br>
+    return (1 << i) - 1 + bs_read( bs, i );<br>
+}<br>
+<br>
+static int32_t getFPS( demux_t *p_demux, block_t * p_block )<br>
+{<br>
+    demux_sys_t *p_sys = p_demux->p_sys;<br>
+<br>
+    bs_t bs;<br>
+    uint8_t * p_decoded_nal;<br>
+    int i_decoded_nal;<br>
+<br>
+    if( p_block->i_buffer < 5 )<br>
+        return -1;<br>
+<br>
+    CreateDecodedNAL( &p_decoded_nal, &i_decoded_nal,<br>
+                              p_block->p_buffer+3, p_block->i_buffer-3 );<br>
+<br>
+    if( !p_decoded_nal )<br>
+        return -1;<br>
+<br>
+    bs_init( &bs, p_decoded_nal, i_decoded_nal );<br>
+    bs_skip( &bs, 12 );<br>
+    int32_t max_sub_layer_minus1 = bs_read( &bs, 3 );</blockquote><div><br></div><div>IMHO I find it clearer when the _minus1 is dropped from the variable and +1 is summed to it, especially if you have to loop on them (but that's just a personal opinion)</div>
<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+    bs_skip( &bs, 17 );<br>
+<br>
+    skipProfileTiersLevel( &bs, max_sub_layer_minus1 );<br>
+<br>
+    int32_t vps_sub_layer_ordering_info_present_flag = bs_read1( &bs );<br>
+    int32_t i = vps_sub_layer_ordering_info_present_flag? 0 : max_sub_layer_minus1;<br>
+    for( ; i <= max_sub_layer_minus1; i++ )</blockquote><div><br></div><div>Slightly hard to read, wouldn't a plain</div><div>if (<font><span style="background-color:rgba(255,255,255,0)">vps_sub_layer_ordering_info_present_flag)</span></font></div>
<div><font><span style>be just as effective?</span></font></div><div><font><span style><br></span></font></div><div><font><span style>Vittorio</span></font></div><div><font><span style><br></span></font></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

+    {<br>
+        read_ue( &bs );<br>
+        read_ue( &bs );<br>
+        read_ue( &bs );<br>
+    }<br>
+    uint32_t vps_max_layer_id = bs_read( &bs, 6);<br>
+    uint32_t vps_num_layer_sets_minus1 = read_ue( &bs );<br>
+    bs_skip( &bs, vps_max_layer_id * vps_num_layer_sets_minus1 );<br>
+<br>
+    if( bs_read1( &bs ))<br>
+    {<br>
+        uint32_t num_units_in_tick = bs_read( &bs, 32 );<br>
+        uint32_t time_scale = bs_read( &bs, 32 );<br>
+        if( num_units_in_tick )<br>
+        {<br>
+            p_sys->f_fps = ( (float) time_scale )/( (float) num_units_in_tick );<br>
+            msg_Dbg(p_demux,"Using framerate %f fps from VPS", p_sys->f_fps);<br>
+        }<br>
+        else<br>
+        {<br>
+            msg_Err( p_demux, "vps_num_units_in_tick null defaulting to 25 fps");<br>
+            p_sys->f_fps = 25.0f;<br>
+        }<br>
+    }<br>
+    else<br>
+    {<br>
+        msg_Err( p_demux, "No timing info in VPS defaulting to 25 fps");<br>
+        p_sys->f_fps = 25.0f;<br>
+    }<br>
+    free(p_decoded_nal);<br>
+    return 0;<br>
+}<br>
--<br>
1.9.rc1<br>
<br>
_______________________________________________<br>
vlc-devel mailing list<br>
To unsubscribe or modify your subscription options:<br>
<a href="https://mailman.videolan.org/listinfo/vlc-devel" target="_blank">https://mailman.videolan.org/listinfo/vlc-devel</a><br>
</blockquote>