<div dir="ltr"><p><br></p><p>---<br> src/input/decoder.c | 120 ++++++++++++++++++++++++++++++++++++++++++++++++++++<br> 1 file changed, 120 insertions(+)</p><div>diff --git a/src/input/decoder.c b/src/input/decoder.c<br>index 400464d..2283503 100644<br>--- a/src/input/decoder.c<br>+++ b/src/input/decoder.c<br>@@ -370,6 +370,80 @@ static int aout_update_format( decoder_t *p_dec )<br>     return 0;<br> }<br> <br>+/* copy and paste from modules/packetizer/h264_nal.c<br>+ */<br>+static bool h264_get_profile_level(const es_format_t *p_fmt, int *pi_profile,<br>+                            int *pi_level, uint8_t *pi_nal_length_size)<br>+{<br>+    uint8_t *p = (uint8_t*)p_fmt->p_extra;<br>+    if(p_fmt->i_extra < 8)<br>+        return false;<br>+<br>+    /* Check the profile / level */<br>+    if (p[0] == 1 && p_fmt->i_extra >= 12)<br>+    {<br>+        if (pi_nal_length_size)<br>+            *pi_nal_length_size = 1 + (p[4]&0x03);<br>+        p += 8;<br>+    }<br>+    else if(!p[0] && !p[1]) /* FIXME: WTH is setting AnnexB data here ? */<br>+    {<br>+        if (!p[2] && p[3] == 1)<br>+            p += 4;<br>+        else if (p[2] == 1)<br>+            p += 3;<br>+        else<br>+            return false;<br>+    }<br>+    else return false;<br>+<br>+    if ( ((*p++)&0x1f) != 7) return false;<br>+<br>+    if (pi_profile)<br>+        *pi_profile = p[0];<br>+<br>+    if (pi_level)<br>+        *pi_level = p[2];<br>+<br>+    return true;<br>+}<br>+<br>+static inline int h264_get_max_dpb_mbs(int level)<br>+{<br>+    int max_dpb_mbs = -1;<br>+    switch (level)<br>+    {<br>+    case 30:<br>+        max_dpb_mbs = 8100;<br>+        break;<br>+    case 31:<br>+        max_dpb_mbs = 18000;<br>+        break;<br>+    case 32:<br>+        max_dpb_mbs = 20480;<br>+        break;<br>+    case 40:<br>+    case 41:<br>+        max_dpb_mbs = 32768;<br>+        break;<br>+    case 42:<br>+        max_dpb_mbs = 34816;<br>+        break;<br>+    case 50:<br>+        max_dpb_mbs = 110400;<br>+        break;<br>+    case 51:<br>+    case 52:<br>+        max_dpb_mbs = 184320;<br>+        break;<br>+    default:<br>+        max_dpb_mbs = -1;<br>+        break;<br>+    }<br>+<br>+    return max_dpb_mbs;<br>+}<br>+<br> static int vout_update_format( decoder_t *p_dec )<br> {<br>     decoder_owner_sys_t *p_owner = p_dec->p_owner;<br>@@ -462,8 +536,54 @@ static int vout_update_format( decoder_t *p_dec )<br>         unsigned dpb_size;<br>         switch( p_dec->fmt_in.i_codec )<br>         {<br>+        // TODO: optimize dpb_size as H264<br>         case VLC_CODEC_HEVC:<br>+            dpb_size = 18;<br>+            break;<br>         case VLC_CODEC_H264:<br>+            {<br>+#define H264_MAX_DPB_SIZE   18<br>+                dpb_size = H264_MAX_DPB_SIZE;<br>+<br>+                int profile = -1;<br>+                int level = -1;<br>+<br>+                profile = p_dec->fmt_in.i_profile;<br>+                level = p_dec->fmt_in.i_level;<br>+                if( profile == -1 || level == -1 )<br>+                {<br>+                    if( h264_get_profile_level( &p_dec->fmt_in, &profile, &level, NULL ) == false )<br>+                    {<br>+                        msg_Warn( p_dec, "get profile and level failed" );<br>+                        break;<br>+                    }<br>+                }<br>+                msg_Dbg( p_dec, "H264 profile %d, level %d", profile, level );<br>+<br>+#define PROFILE_H264_MAIN                 77<br>+#define PROFILE_H264_HIGH                 100<br>+                if( profile != PROFILE_H264_MAIN && profile != PROFILE_H264_HIGH )<br>+                    break;<br>+<br>+                int max_dpb_mbs = h264_get_max_dpb_mbs( level );<br>+                if( max_dpb_mbs <= 0 )<br>+                    break;<br>+<br>+                int pic_width_in_mbs = fmt.i_visible_width / 16;<br>+                int frame_height_in_mbs = fmt.i_visible_height / 16;<br>+                if( pic_width_in_mbs <= 0 || frame_height_in_mbs <= 0 )<br>+                    break;<br>+<br>+                dpb_size = max_dpb_mbs / (pic_width_in_mbs * frame_height_in_mbs);<br>+                if( dpb_size < 5 )<br>+                    dpb_size = 5;<br>+                else if( dpb_size > H264_MAX_DPB_SIZE )<br>+                    dpb_size = H264_MAX_DPB_SIZE;<br>+<br>+                msg_Dbg( p_dec, "width %d, height %d, dpb_size %d",<br>+                        fmt.i_visible_width, fmt.i_visible_height, dpb_size );<br>+            }<br>+            break;<br>         case VLC_CODEC_DIRAC: /* FIXME valid ? */<br>             dpb_size = 18;<br>             break;<br>-- <br>2.7.4</div><div><span><span><br></span></span></div></div>