<!DOCTYPE html>
<html>
  <head>

    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  </head>
  <body>
    Hello,<br>
    <br>
    I am trying to encode one single video frame as a jpg image.<br>
    <br>
    This my code: <br>
    --------------------------------------------------<br>
    <font face="Courier New, Courier, monospace"><span
        style="background-color:#ffffff;padding:0px 0px 0px 2px;"><span
        style="background-color: rgb(255, 255, 255); white-space: pre;">void saveFrame(AVFrame *pFrame,char *filename, int i)</span></span></font><br>
    <font face="Courier New, Courier, monospace">{</font><br>
    <font face="Courier New, Courier, monospace">    // pFrame has
      pix_fmt  AV_PIX_FMT_YUV420P  </font><br>
    <font face="Courier New, Courier, monospace">    int ret;</font><br>
    <font face="Courier New, Courier, monospace">    FILE *JPEGFile;</font><br>
    <font face="Courier New, Courier, monospace">    AVCodec *jpegCodec
      = avcodec_find_encoder(AV_CODEC_ID_MJPEG);</font><br>
    <font face="Courier New, Courier, monospace">    if (!jpegCodec) {</font><br>
    <font face="Courier New, Courier, monospace">        return;</font><br>
    <font face="Courier New, Courier, monospace">    }</font><br>
    <font face="Courier New, Courier, monospace">    AVCodecContext
      *jpegContext = avcodec_alloc_context3(jpegCodec);</font><br>
    <font face="Courier New, Courier, monospace">    if (!jpegContext) {</font><br>
    <font face="Courier New, Courier, monospace">       
      fprintf(stderr,"Error getting encoder context\n");</font><br>
    <font face="Courier New, Courier, monospace">        return;</font><br>
    <font face="Courier New, Courier, monospace">    }</font><br>
    <font face="Courier New, Courier, monospace">    AVPacket* packet =
      av_packet_alloc();</font><br>
    <font face="Courier New, Courier, monospace">  
       jpegContext->height = pFrame->height;</font><br>
    <font face="Courier New, Courier, monospace">  
       jpegContext->width = pFrame->width;</font><br>
    <font face="Courier New, Courier, monospace">  
       jpegContext->pix_fmt = AV_PIX_FMT_YUVJ420P;</font><br>
    <font face="Courier New, Courier, monospace">  
       jpegContext->time_base = (AVRational){1,25};</font><br>
    <font face="Courier New, Courier, monospace">  
       jpegContext->framerate = (AVRational){25,1};</font><br>
    <font face="Courier New, Courier, monospace">  
       jpegContext->qcompress = 0.5;</font><br>
    <font face="Courier New, Courier, monospace">    if
      (avcodec_open2(jpegContext, jpegCodec, NULL) < 0) {</font><br>
    <font face="Courier New, Courier, monospace">       
      fprintf(stderr,"Error opening encoder\n");</font><br>
    <font face="Courier New, Courier, monospace">        return;</font><br>
    <font face="Courier New, Courier, monospace">    }</font><br>
    <font face="Courier New, Courier, monospace">    ret = 
      avcodec_send_frame(jpegContext,pFrame);</font><br>
    <font face="Courier New, Courier, monospace">    if (ret < 0)</font><br>
    <font face="Courier New, Courier, monospace">    {</font><br>
    <font face="Courier New, Courier, monospace">       
      write_avErrorMsg(ret,"saveFrame");</font><br>
    <font face="Courier New, Courier, monospace">        return;</font><br>
    <font face="Courier New, Courier, monospace">    }</font><br>
    <font face="Courier New, Courier, monospace">    ret =
      avcodec_receive_packet(jpegContext,packet);</font><br>
    <font face="Courier New, Courier, monospace">        if (ret < 0)</font><br>
    <font face="Courier New, Courier, monospace">    {</font><br>
    <font face="Courier New, Courier, monospace">       
      write_avErrorMsg(ret,"saveFrame");</font><br>
    <font face="Courier New, Courier, monospace">         return;</font><br>
    <font face="Courier New, Courier, monospace">    }</font><br>
    <font face="Courier New, Courier, monospace">    JPEGFile =
      fopen(filename, "wb");</font><br>
    <font face="Courier New, Courier, monospace">  
       fwrite(packet->data, 1, packet->size, JPEGFile);</font><br>
    <font face="Courier New, Courier, monospace">    fclose(JPEGFile);</font><br>
    <font face="Courier New, Courier, monospace">  
       av_packet_unref(packet);</font><br>
    <font face="Courier New, Courier, monospace">  
       avcodec_close(jpegContext);</font><br>
    <font face="Courier New, Courier, monospace">    return;</font><br>
    <font face="Courier New, Courier, monospace">-----------------------------------------</font><br>
    <br>
    Calling avcodec_send_frame results in this error:<br>
    Assertion ((src_linesize) >= 0 ? (src_linesize) :
    (-(src_linesize))) >= bytewidth failed at
    src/libavutil/imgutils.c:349<br>
    <br>
    Something seems to be wrong with the source (pFrame in my example).
    I assume an issue with the bytewidth, because the values of
    pFrame->linesize are correct. <br>
    How can I fix this problem?<br>
    <br>
    Thanks in advance,<br>
    Udo<br>
  </body>
</html>