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>