Hello everyone!<div><br></div><div>I'm writing an application which cuts videos in pieces with transcoding. Generally it works, but sometimes it crashes on some certain files with BGR24 pix_fmt when i transcode them into mpeg4 with YUV420p.</div>
<div>I tracked down that crash and it leaded me to ff_MPV_encode_picture -> load_input_picture, and sigsegv occurres in this loop:</div><div><pre style="margin-top:0px;margin-bottom:0px"><span style="font-family:arial,helvetica,sans-serif;color:rgb(128,128,0)">for</span><span style="font-family:arial,helvetica,sans-serif;color:rgb(192,192,192)"> </span><span style="font-family:arial,helvetica,sans-serif">(</span><span style="font-family:arial,helvetica,sans-serif">i</span><span style="font-family:arial,helvetica,sans-serif;color:rgb(192,192,192)"> </span><span style="font-family:arial,helvetica,sans-serif">=</span><span style="font-family:arial,helvetica,sans-serif;color:rgb(192,192,192)"> </span><span style="font-family:arial,helvetica,sans-serif;color:rgb(0,0,128)">0</span><span style="font-family:arial,helvetica,sans-serif">;</span><span style="font-family:arial,helvetica,sans-serif;color:rgb(192,192,192)"> </span><span style="font-family:arial,helvetica,sans-serif">i</span><span style="font-family:arial,helvetica,sans-serif;color:rgb(192,192,192)"> </span><span style="font-family:arial,helvetica,sans-serif"><</span><span style="font-family:arial,helvetica,sans-serif;color:rgb(192,192,192)"> </span><span style="font-family:arial,helvetica,sans-serif;color:rgb(0,0,128)">3</span><span style="font-family:arial,helvetica,sans-serif">;</span><span style="font-family:arial,helvetica,sans-serif;color:rgb(192,192,192)"> </span><span style="font-family:arial,helvetica,sans-serif">i</span><span style="font-family:arial,helvetica,sans-serif">++)</span><span style="font-family:arial,helvetica,sans-serif;color:rgb(192,192,192)"> </span><span style="font-family:arial,helvetica,sans-serif">{</span></pre>
</div><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div><pre style="margin-top:0px;margin-bottom:0px"><span style="font-family:arial,helvetica,sans-serif">....</span></pre></div></blockquote><blockquote style="margin:0 0 0 40px;border:none;padding:0px">
<pre style="margin-top:0px;margin-bottom:0px"><font face="arial, helvetica, sans-serif"><span style="color:#808000">int </span>src_stride<span style="color:rgb(192,192,192)"> </span>=<span style="color:rgb(192,192,192)"> </span>pic_arg-><span style="color:rgb(128,0,0)">linesize</span>[i];</font></pre>
</blockquote><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div><pre style="margin-top:0px;margin-bottom:0px"><font face="arial, helvetica, sans-serif">uint8_t<span style="color:#c0c0c0"> </span>*src<span style="color:#c0c0c0"> </span>=<span style="color:#c0c0c0"> </span>pic_arg-><span style="color:#800000">data</span>[i];</font></pre>
<pre style="margin-top:0px;margin-bottom:0px"><font face="arial, helvetica, sans-serif">....</font></pre></div></blockquote><div>
<pre style="margin-top:0px;margin-bottom:0px"><font face="arial, helvetica, sans-serif"><span style="color:#c0c0c0">    </span><font color="#808000">.....</font></font></pre>
<pre style="margin-top:0px;margin-bottom:0px"><font face="arial, helvetica, sans-serif"><span style="color:#c0c0c0">    </span><span style="color:#808000">else</span><span style="color:#c0c0c0"> </span>{</font></pre>
<pre style="margin-top:0px;margin-bottom:0px"><font face="arial, helvetica, sans-serif"><span style="color:#c0c0c0">        </span><span style="color:#808000">while</span><span style="color:#c0c0c0"> </span>(h--)<span style="color:#c0c0c0"> </span>{</font></pre>

<pre style="margin-top:0px;margin-bottom:0px"><font face="arial, helvetica, sans-serif"><span style="color:#c0c0c0">            </span>memcpy(dst,<span style="color:#c0c0c0"> </span>src,<span style="color:#c0c0c0"> </span>w); //<-----HERE</font></pre>

<pre style="margin-top:0px;margin-bottom:0px"><font face="arial, helvetica, sans-serif"><span style="color:#c0c0c0">            </span>dst<span style="color:#c0c0c0"> </span>+=<span style="color:#c0c0c0"> </span>dst_stride;</font></pre>

<pre style="margin-top:0px;margin-bottom:0px"><font face="arial, helvetica, sans-serif"><span style="color:#c0c0c0">            </span>src<span style="color:#c0c0c0"> </span>+=<span style="color:#c0c0c0"> </span>src_stride;</font></pre>

<pre style="margin-top:0px;margin-bottom:0px"><font face="arial, helvetica, sans-serif"><span style="color:#c0c0c0">        </span>}</font></pre>
<pre style="margin-top:0px;margin-bottom:0px"><font face="arial, helvetica, sans-serif"><span style="color:#c0c0c0">    </span>}</font></pre>
<pre style="margin-top:0px;margin-bottom:0px"><font face="arial, helvetica, sans-serif">}</font></pre><pre style="margin-top:0px;margin-bottom:0px"><font face="arial, helvetica, sans-serif">because src is NULL.</font></pre>
<pre style="margin-top:0px;margin-bottom:0px"><font face="arial, helvetica, sans-serif"><br></font></pre><pre style="margin-top:0px;margin-bottom:0px"><font face="arial, helvetica, sans-serif">Everything was ok when i == 0, but on the next iteration <i>src</i> pointer moves to another pic_arg->data[i] which is 0x0... I've noticed that not only pic_arg->data[i], but linesize also contains only one</font></pre>
<pre style="margin-top:0px;margin-bottom:0px"><font face="arial, helvetica, sans-serif">value(-2160) and that confused me a lot.</font></pre><pre style="margin-top:0px;margin-bottom:0px"><font face="arial, helvetica, sans-serif"><br>
</font></pre><pre style="margin-top:0px;margin-bottom:0px"><font face="arial, helvetica, sans-serif">Could anyone tell me how can I fix that? I undestand that frame->data and frame->linesize should contain at least three values, but they contain only one after decoding.</font></pre>
<pre style="margin-top:0px;margin-bottom:0px"><font face="arial, helvetica, sans-serif">At first i though that i need to convert frames from BGR24 to YUV420p, but that doesn't help</font></pre><pre style="margin-top:0px;margin-bottom:0px">
<font face="arial, helvetica, sans-serif">here is the code of conversation BGR24->YUV420p:</font></pre><pre style="margin-top:0px;margin-bottom:0px"><font face="arial, helvetica, sans-serif"><br></font></pre><pre style="margin-top:0px;margin-bottom:0px">
<pre style="margin-top:0px;margin-bottom:0px"><font face="arial, helvetica, sans-serif"><span style="color:#800080">AVFrame</span><span style="color:#c0c0c0"> </span>*</font></pre><pre style="margin-top:0px;margin-bottom:0px">
<font face="arial, helvetica, sans-serif"><span style="color:#800080">Videocut</span>::convertFrameToYUV420(</font></pre><pre style="margin-top:0px;margin-bottom:0px"><font face="arial, helvetica, sans-serif"><span style="color:#c0c0c0">    </span><span style="color:#800080">AVCodecContext</span><span style="color:#c0c0c0"> </span>*aCtx,</font></pre>
<pre style="margin-top:0px;margin-bottom:0px"><font face="arial, helvetica, sans-serif"><span style="color:#c0c0c0">    </span><span style="color:#800080">AVFrame</span><span style="color:#c0c0c0"> </span>*aFrame</font></pre>
<pre style="margin-top:0px;margin-bottom:0px"><font face="arial, helvetica, sans-serif">)</font></pre><pre style="margin-top:0px;margin-bottom:0px"><font face="arial, helvetica, sans-serif">{</font></pre><pre style="margin-top:0px;margin-bottom:0px">
<font face="arial, helvetica, sans-serif"><span style="color:#c0c0c0">    </span><span style="color:#808000">if</span><span style="color:#c0c0c0"> </span>(NULL<span style="color:#c0c0c0"> </span>==<span style="color:#c0c0c0"> </span>aFrame<span style="color:#c0c0c0"> </span>||<span style="color:#c0c0c0"> </span>NULL<span style="color:#c0c0c0"> </span>==<span style="color:#c0c0c0"> </span>aCtx)<span style="color:#c0c0c0"> </span>{</font></pre>
<pre style="margin-top:0px;margin-bottom:0px"><font face="arial, helvetica, sans-serif"><span style="color:#c0c0c0">        </span><span style="color:#808000">return</span><span style="color:#c0c0c0"> </span>NULL;</font></pre>
<pre style="margin-top:0px;margin-bottom:0px"><font face="arial, helvetica, sans-serif"><span style="color:#c0c0c0">        </span><span style="color:#008000">/* NOTREACHED */</span></font></pre><pre style="margin-top:0px;margin-bottom:0px">
<font face="arial, helvetica, sans-serif"><span style="color:#c0c0c0">    </span>}</font></pre><pre style="margin-top:0px;margin-bottom:0px"><font face="arial, helvetica, sans-serif"><br></font></pre><pre style="margin-top:0px;margin-bottom:0px">
<font face="arial, helvetica, sans-serif"><span style="color:#c0c0c0">    </span><span style="color:#800080">SwsContext</span><span style="color:#c0c0c0"> </span>*imgConvertCtx<span style="color:#c0c0c0"> </span>=<span style="color:#c0c0c0"> </span>NULL;</font></pre>
<pre style="margin-top:0px;margin-bottom:0px"><font face="arial, helvetica, sans-serif"><span style="color:#c0c0c0">    </span><span style="color:#800080">AVFrame</span><span style="color:#c0c0c0"> </span>*tempFrame<span style="color:#c0c0c0"> </span>=<span style="color:#c0c0c0"> </span><span style="color:#000080">0</span>;</font></pre>
<pre style="margin-top:0px;margin-bottom:0px"><span style="font-family:arial,helvetica,sans-serif;color:rgb(192,192,192)">    </span><span style="font-family:arial,helvetica,sans-serif;color:rgb(0,128,0)">/* as we only generate a YUV420P picture, we must convert it</span></pre>
<pre style="margin-top:0px;margin-bottom:0px"><span style="color:#008000"><font face="arial, helvetica, sans-serif">       to the codec pixel format if needed */</font></span></pre><pre style="margin-top:0px;margin-bottom:0px">
<font face="arial, helvetica, sans-serif"><span style="color:#c0c0c0">    </span>imgConvertCtx<span style="color:#c0c0c0"> </span>=<span style="color:#c0c0c0"> </span>sws_getContext(</font></pre><pre style="margin-top:0px;margin-bottom:0px">
<font face="arial, helvetica, sans-serif"><span style="color:#c0c0c0">        </span>aCtx-><span style="color:#800000">width</span>,</font></pre><pre style="margin-top:0px;margin-bottom:0px"><font face="arial, helvetica, sans-serif"><span style="color:#c0c0c0">        </span>aCtx-><span style="color:#800000">height</span>,</font></pre>
<pre style="margin-top:0px;margin-bottom:0px"><font face="arial, helvetica, sans-serif"><span style="color:#c0c0c0">        </span>aCtx-><span style="color:#800000">pix_fmt</span>,</font></pre><pre style="margin-top:0px;margin-bottom:0px">
<font face="arial, helvetica, sans-serif"><span style="color:#c0c0c0">        </span>aCtx-><span style="color:#800000">width</span>,</font></pre><pre style="margin-top:0px;margin-bottom:0px"><font face="arial, helvetica, sans-serif"><span style="color:#c0c0c0">        </span>aCtx-><span style="color:#800000">height</span>,</font></pre>
<pre style="margin-top:0px;margin-bottom:0px"><font face="arial, helvetica, sans-serif"><span style="color:#c0c0c0">        </span><span style="color:#800080">PIX_FMT_YUV420P</span>,</font></pre><pre style="margin-top:0px;margin-bottom:0px">
<font face="arial, helvetica, sans-serif"><span style="color:#c0c0c0">        </span>SWS_BICUBIC,</font></pre><pre style="margin-top:0px;margin-bottom:0px"><font face="arial, helvetica, sans-serif"><span style="color:#c0c0c0">        </span>NULL,</font></pre>
<pre style="margin-top:0px;margin-bottom:0px"><font face="arial, helvetica, sans-serif"><span style="color:#c0c0c0">        </span>NULL,</font></pre><pre style="margin-top:0px;margin-bottom:0px"><font face="arial, helvetica, sans-serif"><span style="color:#c0c0c0">        </span>NULL</font></pre>
<pre style="margin-top:0px;margin-bottom:0px"><font face="arial, helvetica, sans-serif"><span style="color:#c0c0c0">    </span>);</font></pre><pre style="margin-top:0px;margin-bottom:0px"><font face="arial, helvetica, sans-serif"><span style="color:#c0c0c0">    </span><span style="color:#808000">if</span><span style="color:#c0c0c0"> </span>(NULL<span style="color:#c0c0c0"> </span>==<span style="color:#c0c0c0"> </span>imgConvertCtx)<span style="color:#c0c0c0"> </span>{</font></pre>
<pre style="margin-top:0px;margin-bottom:0px"><font face="arial, helvetica, sans-serif"><span style="color:#c0c0c0">        </span>cout<span style="color:#c0c0c0"> </span><<<span style="color:#c0c0c0"> </span><span style="color:#008000">"\nCan not initialize the conversion context\n"</span>;</font></pre>
<pre style="margin-top:0px;margin-bottom:0px"><font face="arial, helvetica, sans-serif"><span style="color:#c0c0c0">        </span><span style="color:#808000">return</span><span style="color:#c0c0c0"> </span>NULL;</font></pre>
<pre style="margin-top:0px;margin-bottom:0px"><font face="arial, helvetica, sans-serif"><span style="color:#c0c0c0">        </span><span style="color:#008000">/* NOTREACHED */</span></font></pre><pre style="margin-top:0px;margin-bottom:0px">
<font face="arial, helvetica, sans-serif"><span style="color:#c0c0c0">    </span>}</font></pre><pre style="margin-top:0px;margin-bottom:0px"><span style="font-family:arial,helvetica,sans-serif;color:rgb(192,192,192)">    </span><span style="font-family:arial,helvetica,sans-serif">tempFrame</span><span style="font-family:arial,helvetica,sans-serif;color:rgb(192,192,192)"> </span><span style="font-family:arial,helvetica,sans-serif">=</span><span style="font-family:arial,helvetica,sans-serif;color:rgb(192,192,192)"> </span><span style="font-family:arial,helvetica,sans-serif">avcodec_alloc_frame</span><span style="font-family:arial,helvetica,sans-serif">();</span></pre>
<pre style="margin-top:0px;margin-bottom:0px"><font face="arial, helvetica, sans-serif"><span style="color:#c0c0c0">    </span><span style="color:#808000">if</span><span style="color:#c0c0c0"> </span>(NULL<span style="color:#c0c0c0"> </span>==<span style="color:#c0c0c0"> </span>tempFrame)<span style="color:#c0c0c0"> </span>{</font></pre>
<pre style="margin-top:0px;margin-bottom:0px"><font face="arial, helvetica, sans-serif"><span style="color:#c0c0c0">        </span>sws_freeContext(imgConvertCtx);</font></pre><pre style="margin-top:0px;margin-bottom:0px">
<font face="arial, helvetica, sans-serif"><span style="color:#c0c0c0">        </span><span style="color:#808000">return</span><span style="color:#c0c0c0"> </span>NULL;</font></pre><pre style="margin-top:0px;margin-bottom:0px">
<font face="arial, helvetica, sans-serif"><span style="color:#c0c0c0">        </span><span style="color:#008000">/* NOTREACHED */</span></font></pre><pre style="margin-top:0px;margin-bottom:0px"><font face="arial, helvetica, sans-serif"><span style="color:#c0c0c0">    </span>}</font></pre>
<pre style="margin-top:0px;margin-bottom:0px"><font face="arial, helvetica, sans-serif"><br></font></pre><pre style="margin-top:0px;margin-bottom:0px"><font face="arial, helvetica, sans-serif"><span style="color:#c0c0c0">    </span><span style="color:#808000">int</span><span style="color:#c0c0c0"> </span>numBytes<span style="color:#c0c0c0"> </span>=<span style="color:#c0c0c0"> </span>avpicture_get_size(<span style="color:#800080">PIX_FMT_YUV420P</span>,<span style="color:#c0c0c0"> </span>aCtx-><span style="color:#800000">width</span>,<span style="color:#c0c0c0"> </span>aCtx-><span style="color:#800000">height</span>);</font></pre>
<pre style="margin-top:0px;margin-bottom:0px"><font face="arial, helvetica, sans-serif"><span style="color:#c0c0c0">    </span>uint8_t<span style="color:#c0c0c0"> </span>*buffer<span style="color:#c0c0c0"> </span>=<span style="color:#c0c0c0"> </span><span style="color:#808000">new</span><span style="color:#c0c0c0"> </span>uint8_t[numBytes];</font></pre>
<pre style="margin-top:0px;margin-bottom:0px"><font face="arial, helvetica, sans-serif"><br></font></pre><pre style="margin-top:0px;margin-bottom:0px"><font face="arial, helvetica, sans-serif"><span style="color:#c0c0c0">    </span>avpicture_fill(</font></pre>
<pre style="margin-top:0px;margin-bottom:0px"><font face="arial, helvetica, sans-serif"><span style="color:#c0c0c0">        </span>(<span style="color:#800080">AVPicture</span><span style="color:#c0c0c0"> </span>*)tempFrame,</font></pre>
<pre style="margin-top:0px;margin-bottom:0px"><font face="arial, helvetica, sans-serif"><span style="color:#c0c0c0">        </span>buffer,</font></pre><pre style="margin-top:0px;margin-bottom:0px"><font face="arial, helvetica, sans-serif"><span style="color:#c0c0c0">        </span><span style="color:#800080">PIX_FMT_YUV420P</span>,</font></pre>
<pre style="margin-top:0px;margin-bottom:0px"><font face="arial, helvetica, sans-serif"><span style="color:#c0c0c0">        </span>aCtx-><span style="color:#800000">width</span>,</font></pre><pre style="margin-top:0px;margin-bottom:0px">
<font face="arial, helvetica, sans-serif"><span style="color:#c0c0c0">        </span>aCtx-><span style="color:#800000">height</span></font></pre><pre style="margin-top:0px;margin-bottom:0px"><font face="arial, helvetica, sans-serif"><span style="color:#c0c0c0">    </span>);</font></pre>
<pre style="margin-top:0px;margin-bottom:0px"><font face="arial, helvetica, sans-serif"><span style="color:#c0c0c0">    </span>avcodec_get_frame_defaults(tempFrame);</font></pre><pre style="margin-top:0px;margin-bottom:0px">
<font face="arial, helvetica, sans-serif"><span style="color:#c0c0c0">    </span>sws_scale(imgConvertCtx,</font></pre><pre style="margin-top:0px;margin-bottom:0px"><font face="arial, helvetica, sans-serif"><span style="color:#c0c0c0">        </span>aFrame-><span style="color:#800000">data</span>,</font></pre>
<pre style="margin-top:0px;margin-bottom:0px"><font face="arial, helvetica, sans-serif"><span style="color:#c0c0c0">        </span>aFrame-><span style="color:#800000">linesize</span>,</font></pre><pre style="margin-top:0px;margin-bottom:0px">
<font face="arial, helvetica, sans-serif"><span style="color:#c0c0c0">        </span><span style="color:#000080">0</span>,</font></pre><pre style="margin-top:0px;margin-bottom:0px"><font face="arial, helvetica, sans-serif"><span style="color:#c0c0c0">        </span>aCtx-><span style="color:#800000">height</span>,</font></pre>
<pre style="margin-top:0px;margin-bottom:0px"><font face="arial, helvetica, sans-serif"><span style="color:#c0c0c0">        </span>tempFrame-><span style="color:#800000">data</span>,</font></pre><pre style="margin-top:0px;margin-bottom:0px">
<font face="arial, helvetica, sans-serif"><span style="color:#c0c0c0">        </span>tempFrame-><span style="color:#800000">linesize</span></font></pre><pre style="margin-top:0px;margin-bottom:0px"><font face="arial, helvetica, sans-serif"><span style="color:#c0c0c0">    </span>);</font></pre>
<pre style="margin-top:0px;margin-bottom:0px"><span style="font-family:arial,helvetica,sans-serif;color:rgb(192,192,192)">    </span><span style="font-family:arial,helvetica,sans-serif">av_freep(aFrame);</span></pre><pre style="margin-top:0px;margin-bottom:0px">
<font face="arial, helvetica, sans-serif"><span style="color:#c0c0c0">    </span>sws_freeContext(imgConvertCtx);</font></pre><pre style="margin-top:0px;margin-bottom:0px"><span style="font-family:arial,helvetica,sans-serif;color:rgb(192,192,192)">   </span><span style="font-family:arial,helvetica,sans-serif;color:rgb(128,128,0)">return</span><span style="font-family:arial,helvetica,sans-serif;color:rgb(192,192,192)"> </span><span style="font-family:arial,helvetica,sans-serif">tempFrame;</span></pre>
<pre style="margin-top:0px;margin-bottom:0px"><font face="arial, helvetica, sans-serif">}</font></pre><pre style="margin-top:0px;margin-bottom:0px"><font face="arial, helvetica, sans-serif"><br></font></pre><pre style="margin-top:0px;margin-bottom:0px">
<font face="arial, helvetica, sans-serif">I can show you all the code where i decode and encode, but it's all huge and I don't want to make a book from this letter,</font></pre><pre style="margin-top:0px;margin-bottom:0px">
<font face="arial, helvetica, sans-serif">So you can find it here </font><a href="http://www.pasteall.org/33080/cpp"><font face="arial, helvetica, sans-serif">http://www.pasteall.org/33080/cpp</font></a></pre><pre style="margin-top:0px;margin-bottom:0px">
<font face="arial, helvetica, sans-serif"><br></font></pre></pre><pre style="margin-top:0px;margin-bottom:0px"><font face="arial, helvetica, sans-serif">Btw, video has not common size 720x280, i don't if that could help.</font></pre>
<pre style="margin-top:0px;margin-bottom:0px"><font face="arial, helvetica, sans-serif"><br></font></pre><pre style="margin-top:0px;margin-bottom:0px"><font face="arial, helvetica, sans-serif">Any help would be much appreciated! </font></pre>
<pre style="margin-top:0px;margin-bottom:0px"><font face="arial, helvetica, sans-serif">Thank you guys in advance!</font></pre><pre style="margin-top:0px;margin-bottom:0px"><font face="arial, helvetica, sans-serif"><br></font></pre>
<pre style="margin-top:0px;margin-bottom:0px"><font face="arial, helvetica, sans-serif">Best regards,</font></pre><pre style="margin-top:0px;margin-bottom:0px"><font face="arial, helvetica, sans-serif">gavlig</font></pre>
</div>