title: FFMPEG sws_scale Crash on Android
body: <p>I have an app that convert images to video, in Google Play I see the following crash (which the only details I get is the name of the function and I don't understand the rest):</p>
  
  <pre><code>backtrace:
  #00 pc 0000cc78 /data/app-lib/com.myapp-1/libswscale.so (sws_scale+204)
  #01 pc 000012af /data/app-lib/com.myapp-1/libffmpeg.so (OpenImage+322)
  
  code around pc:
  79065c58 e58d8068 e58d2070 e58d3074 059d00b0 
  </code></pre>
  
  <p>The code point to the function <code>sws_scale</code>, the code works almost all the time on my device (Nexus 5) but I see a lot of reports even with the same device with that issue. Any idea why this could happen?</p>
  
  <pre><code>AVFrame* OpenImage(const char* imageFileName, int W_VIDEO, int H_VIDEO, int* numBytes)
  {
      AVFormatContext *pFormatCtx;
      AVCodecContext *pCodecCtx;
      AVCodec *pCodec;
      AVFrame *pFrame;
      int frameFinished;
      uint8_t *buffer;
      AVPacket packet;
      int srcBytes;
  
      AVFrame* frame2 = NULL;// scaled frame
      uint8_t* frame2_buffer;
      struct SwsContext *resize;
  
      if(av_open_input_file(&amp;pFormatCtx, imageFileName, NULL, 0, NULL)!=0)
      {
          LOGI("Can't open image file '%s'\n", imageFileName);
          return NULL;
      }
      //dump_format(pFormatCtx, 0, imageFileName, 0);
      if (av_find_stream_info(pFormatCtx) &lt; 0)
      {
          LOGI("Can't find stream info.");
          return NULL;
      }
      pCodecCtx = pFormatCtx-&gt;streams[0]-&gt;codec;
      pCodecCtx-&gt;pix_fmt = PIX_FMT_YUV420P;
  
      // Find the decoder for the video stream
      pCodec = avcodec_find_decoder(pCodecCtx-&gt;codec_id);
      if (!pCodec)
      {
          LOGI("Codec not found\n");
          return NULL;
      }
  
      // Open codec
      if(avcodec_open(pCodecCtx, pCodec)&lt;0)
      {
          LOGI("Could not open codec\n");
          return NULL;
      }
      pFrame = avcodec_alloc_frame();
      if (!pFrame)
      {
          LOGI("Can't allocate memory for AVFrame\n");
          return NULL;
      }
  
      // Determine required buffer size and allocate buffer
      srcBytes = avpicture_get_size(PIX_FMT_YUV420P, pCodecCtx-&gt;width, pCodecCtx-&gt;height);
      buffer = (uint8_t *) av_malloc(srcBytes * sizeof(uint8_t));
      avpicture_fill((AVPicture *) pFrame, buffer, PIX_FMT_YUV420P, pCodecCtx-&gt;width, pCodecCtx-&gt;height);
  
      // Read frame
      if (av_read_frame(pFormatCtx, &amp;packet) &gt;= 0)
      {
          int ret;
  //      if(packet.stream_index != 0)
  //          continue;
          ret = avcodec_decode_video2(pCodecCtx, pFrame, &amp;frameFinished, &amp;packet);
          if (ret &gt; 0)
          {
              //LOGI("Frame is decoded, size %d\n", ret);
              pFrame-&gt;quality = 4;
  
              // Create another frame for resized result
              frame2 = avcodec_alloc_frame();
              *numBytes = avpicture_get_size(PIX_FMT_YUV420P, W_VIDEO, H_VIDEO);
              frame2_buffer = (uint8_t *)av_malloc(*numBytes * sizeof(uint8_t));
              avpicture_fill((AVPicture*)frame2, frame2_buffer, PIX_FMT_YUV420P, W_VIDEO, H_VIDEO);
  
              // Get resize context
              resize = sws_getContext(pCodecCtx-&gt;width, pCodecCtx-&gt;height, PIX_FMT_YUV420P, W_VIDEO, H_VIDEO, PIX_FMT_YUV420P, SWS_BICUBIC, NULL, NULL, NULL);
  
              // frame2 should be filled with resized samples
              ret = sws_scale(resize, (const uint8_t* const*)pFrame-&gt;data, pFrame-&gt;linesize, 0, pCodecCtx-&gt;height, frame2-&gt;data, frame2-&gt;linesize);
              sws_freeContext(resize);
          }
          else
              LOGI("Error [%d] while decoding frame: %s\n", ret, strerror(AVERROR(ret)));
      }
      av_free(pFrame);
      av_free_packet(&amp;packet);
      avcodec_close(pCodecCtx);
      //av_free(pCodecCtx);
      av_close_input_file(pFormatCtx);
      return frame2;
  }
  </code></pre>