title: Crash at sws_scale when converting AVFrame to RGB32
body: <p>Crashing at sws_scale when converting an AVPicture</p>
  
  <p>At first I was using sws_scale to actually scale the frames up but the cpu overhead was too high, so I decided to just convert the frames and adjust the QImage size instead. Before it was working and I was getting the video displaying when rendered, but now it crashes at sws_scale.</p>
  
  <p>This is written in Qt for Android and using FFMpeg 3.1.4.</p>
  
  <p>Also, is there another way around not using the deprecated functions?</p>
  
  <p>Does anybody know why I am getting the crash at sws_scale?</p>
  
  <p>The class for the VideoFrameCopy</p>
  
  <pre><code>class VideoFrameCopy {
  public:
      VideoFrameCopy() {}
      VideoFrameCopy(AVFrame *frame) { copyAVFrame(frame); }
      ~VideoFrameCopy();
      void copyAVFrame(AVFrame *frame); // copy essential data from AVFrame
  
      AVPicture picture;
  
      int64_t pkt_pts = -1; // show it hasn't been initialised
      int64_t best_pts;
      int interlaced_frame;
      int width = 0, height = 0;
      int format = -1;
  };
  </code></pre>
  
  <p>The code that converts the frame to RGBA8888 QImage</p>
  
  <pre><code>if (frame) {
  
      if (image-&gt;width() != vid_ctx-&gt;width || image-&gt;height() != vid_ctx-&gt;height) {
          QSize old_size(image-&gt;size());
  
          // block until renderer has finished with it
  
          while (parent-&gt;buffer_ready) {
              QThread::yieldCurrentThread();
          }
  
          delete image;
  
          image = new QImage(vid_ctx-&gt;width, vid_ctx-&gt;height, QImage::Format_RGBA8888);
          parent-&gt;image = image;
  
          if (scale_context) sws_freeContext(scale_context);
          scale_context = nullptr;
  
          qDebug() &lt;&lt; "Video image size" &lt;&lt; image-&gt;size() &lt;&lt; "old" &lt;&lt; old_size;
      }
  
      // the src width and height may need to change to use the context info instead
  
      if (!scale_context) { // create the scale context
          int src_width = vid_ctx-&gt;width;
          int src_height = vid_ctx-&gt;height;
          AVPixelFormat src_format = vid_ctx-&gt;pix_fmt;//(AVPixelFormat)frame-&gt;format;
  
          int dst_width = vid_ctx-&gt;width;
          int dst_height = vid_ctx-&gt;height;
          AVPixelFormat dst_format = AV_PIX_FMT_RGBA;
  
          scale_context = sws_getContext(src_width, src_height, src_format,
                                         dst_width, dst_height, dst_format,
                                         SWS_FAST_BILINEAR, NULL, NULL, NULL);
  
          av_image_fill_linesizes(scale_linesizes, dst_format, vid_ctx-&gt;width);
  
          qDebug() &lt;&lt; "Created scale context" &lt;&lt; scale_context;
      }
  
      if (scale_context) { // valid
          scale_data[0] = image-&gt;bits();
  
          sws_scale(scale_context,
                    frame-&gt;picture.data, // deprecated
                    frame-&gt;picture.linesize, // deprecated
                    0, image-&gt;height(),
                    scale_data,
                    scale_linesizes);
  
          qDebug() &lt;&lt; "Frame converted";
      }
  
      //av_frame_unref(frame);
  
      //vid_frames_mutex.lock();
      //if (quit) av_frame_free(&amp;frame);
      if (quit) delete frame;
      else vid_frames_unused.push_back(frame);
      //vid_frames_mutex.unlock();
  
      //qDebug() &lt;&lt; "got frame" &lt;&lt; clock_current_frame_last &lt;&lt; "clock" &lt;&lt; clock_current_time;
  }
  
  vid_frames_mutex.unlock();
  
  return frame != nullptr;
  </code></pre>
  
  <p>Functions from the VideoFrameCopy class</p>
  
  <pre><code>void VideoFrameCopy::copyAVFrame(AVFrame *frame) {
      if (pkt_pts != -1 &amp;&amp;
              (width != frame-&gt;width ||
               height != frame-&gt;height ||
               format != frame-&gt;format)
              ) { // picture changed?
          avpicture_free(&amp;picture); // deprecated
          pkt_pts = -1;
      }
  
      width = frame-&gt;width;
      height = frame-&gt;height;
      format = frame-&gt;format;
      interlaced_frame = frame-&gt;interlaced_frame;
  
      if (pkt_pts == -1) { // alloc picture
          if (avpicture_alloc(&amp;picture, (AVPixelFormat)format, width, height) &lt; 0) return; // deprecated
          int size = avpicture_get_size((AVPixelFormat)format, width, height); // deprecated
          uint8_t *picture_data = (uint8_t*)av_malloc(size);
          avpicture_fill(&amp;picture, picture_data, (AVPixelFormat)format, width, height); // deprecated
  
          qDebug() &lt;&lt; "New frame" &lt;&lt; width &lt;&lt; "x" &lt;&lt; height &lt;&lt; format;
      }
  
      pkt_pts = frame-&gt;pkt_pts;
      best_pts = av_frame_get_best_effort_timestamp(frame);
  
      av_picture_copy(&amp;picture, (AVPicture*)frame, (AVPixelFormat)format, width, height); // deprecated
  
      qDebug() &lt;&lt; "picture" &lt;&lt; picture.linesize[0] &lt;&lt; picture.linesize[1]; // deprecated
  }
  
  VideoFrameCopy::~VideoFrameCopy() {
      if (pkt_pts != -1) {
          /*if (picture.data) {
              av_free(picture.data);
              picture.data = nullptr;
          }*/
          avpicture_free(&amp;picture); // deprecated
      }
  }
  </code></pre>
  
  <p>Sample output from the logcat</p>
  
  <pre><code>D/libcwengage2.so(20157): ../cwengage2/ffmpegfile.cpp:659 (void VideoFrameCopy::copyAVFrame(AVFrame*)): New frame 640 x 358 0
  D/libcwengage2.so(20157): ../cwengage2/ffmpegfile.cpp:667 (void VideoFrameCopy::copyAVFrame(AVFrame*)): picture 640 320
  D/libcwengage2.so(20157): ../cwengage2/ffmpegfile.cpp:586 (bool FFMpegFile::getVideoFrame()): Video image size QSize(640, 358) old QSize(500, 320)
  D/libcwengage2.so(20157): ../cwengage2/ffmpegfile.cpp:659 (void VideoFrameCopy::copyAVFrame(AVFrame*)): New frame 640 x 358 0
  D/libcwengage2.so(20157): ../cwengage2/ffmpegfile.cpp:606 (bool FFMpegFile::getVideoFrame()): Created scale context 0x4bb49060
  D/libcwengage2.so(20157): ../cwengage2/ffmpegfile.cpp:667 (void VideoFrameCopy::copyAVFrame(AVFrame*)): picture 640 320
  F/libc    (20157): Fatal signal 7 (SIGBUS) at 0x4e065008 (code=1), thread 20335 (QThread)
  I/DEBUG   (  116): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
  I/DEBUG   (  116): Build fingerprint: 'ODROID/odroidc/odroidc:4.4.2/KOT49H/odroidc-eng-s805_4.4.2_master-410:eng/test-keys'
  I/DEBUG   (  116): Revision: '10'
  I/DEBUG   (  116): pid: 20157, tid: 20335, name: QThread  &gt;&gt;&gt; org.qtproject.example &lt;&lt;&lt;
  I/DEBUG   (  116): signal 7 (SIGBUS), code 1 (BUS_ADRALN), fault addr 4e065008
  I/DEBUG   (  116):     r0 00000280  r1 00000166  r2 4e065008  r3 00000a00
  I/DEBUG   (  116):     r4 4d9bd030  r5 00000280  r6 4d9f4f28  r7 00000140
  I/DEBUG   (  116):     r8 00000280  r9 00000010  sl 4da02ee8  fp 4e065a08
  I/DEBUG   (  116):     ip 4d9bd2a0  sp 4c1948f8  lr 4a8f1d2c  pc 4a8f4dc0  cpsr 280f0010
  I/DEBUG   (  116):     d0  004a004a004a004a  d1  0081ffccffe70066
  I/DEBUG   (  116):     d2  004a004a004a004a  d3  0000000000000000
  I/DEBUG   (  116):     d4  0000000000000000  d5  0000000000000000
  I/DEBUG   (  116):     d6  0000000001010101  d7  0000000001010101
  I/DEBUG   (  116):     d8  0000000001010101  d9  ffffffffffffffff
  I/DEBUG   (  116):     d10 0000000000000000  d11 0000000000000000
  I/DEBUG   (  116):     d12 0000000000000000  d13 ffffffffffffffff
  I/DEBUG   (  116):     d14 004a004a004a004a  d15 004a004a004a004a
  I/DEBUG   (  116):     d16 0000000000000000  d17 0000000000000000
  I/DEBUG   (  116):     d18 0000000000000000  d19 0000000000000000
  I/DEBUG   (  116):     d20 0000000000000000  d21 0000000000000000
  I/DEBUG   (  116):     d22 0000000000000000  d23 0000000000000000
  I/DEBUG   (  116):     d24 0000000000000000  d25 0000000000000000
  I/DEBUG   (  116):     d26 0000000000000000  d27 0000000000000000
  I/DEBUG   (  116):     d28 004a004a004a004a  d29 0000000000000000
  I/DEBUG   (  116):     d30 0000000000000000  d31 0000000000000000
  I/DEBUG   (  116):     scr 20000010
  I/DEBUG   (  116): 
  I/DEBUG   (  116): backtrace:
  I/DEBUG   (  116):     #00  pc 0000edc0  /data/app-lib/org.qtproject.example-1/libswscale-4.so
  I/DEBUG   (  116):     #01  pc 0000bd28  /data/app-lib/org.qtproject.example-1/libswscale-4.so
  I/DEBUG   (  116): 
  I/DEBUG   (  116): stack:
  I/DEBUG   (  116):          4c1948b8  0000004b  
  I/DEBUG   (  116):          4c1948bc  4bb2d270  
  I/DEBUG   (  116):          4c1948c0  0000013c  
  I/DEBUG   (  116):          4c1948c4  4011edbc  /system/lib/libc.so (dlmalloc+480)
  I/DEBUG   (  116):          4c1948c8  4c19494a  [stack:20335]
  I/DEBUG   (  116):          4c1948cc  4015e384  
  I/DEBUG   (  116):          4c1948d0  00000010  
  I/DEBUG   (  116):          4c1948d4  489033ef  /data/app-lib/org.qtproject.example-1/libQt5Core.so
  I/DEBUG   (  116):          4c1948d8  00001000  
  I/DEBUG   (  116):          4c1948dc  00000000  
  I/DEBUG   (  116):          4c1948e0  4bb2d470  
  I/DEBUG   (  116):          4c1948e4  4bb2d478  
  I/DEBUG   (  116):          4c1948e8  4bb2d478  
  I/DEBUG   (  116):          4c1948ec  4bb2d470  
  I/DEBUG   (  116):          4c1948f0  00000002  
  I/DEBUG   (  116):          4c1948f4  4012109c  /system/lib/libc.so (dlfree+996)
  I/DEBUG   (  116):     #00  4c1948f8  11111111  
  I/DEBUG   (  116):          ........  ........
  I/DEBUG   (  116):     #01  4c1948f8  11111111  
  I/DEBUG   (  116):          4c1948fc  3fa11111  
  I/DEBUG   (  116):          4c194900  40000000  
  I/DEBUG   (  116):          4c194904  40640d79  /system/lib/libskia.so
  I/DEBUG   (  116):          4c194908  00000000  
  I/DEBUG   (  116):          4c19490c  3ff00000  
  I/DEBUG   (  116):          4c194910  00000000  
  I/DEBUG   (  116):          4c194914  3ff00000  
  I/DEBUG   (  116):          4c194918  00000000  
  I/DEBUG   (  116):          4c19491c  3ff00000  
  I/DEBUG   (  116):          4c194920  00000000  
  I/DEBUG   (  116):          4c194924  3f800000  
  I/DEBUG   (  116):          4c194928  00000000  
  I/DEBUG   (  116):          4c19492c  00000000  
  I/DEBUG   (  116):          4c194930  00000000  
  I/DEBUG   (  116):          4c194934  00000000  
  I/DEBUG   (  116): 
  I/DEBUG   (  116): memory near r2:
  I/DEBUG   (  116):     4e064fe8 00000000 00000000 00000000 00000007  
  
  ...
  
  I/DEBUG   (  116): memory map around fault addr 4e065008:
  I/DEBUG   (  116):     4dd15000-4df15000 rw- /dev/mali
  I/DEBUG   (  116):     4df15000-4e199000 rw- 
  I/DEBUG   (  116):     4e676000-4e876000 rw- /dev/mali
  I/BootReceiver(  479): Copying /data/tombstones/tombstone_07 to DropBox (SYSTEM_TOMBSTONE)
  W/ActivityManager(  479):   Force finishing activity org.qtproject.example/org.qtproject.qt5.android.bindings.QtActivity
  I/WindowState(  479): WIN DEATH: Window{64cf3a40 u0 org.qtproject.example/org.qtproject.qt5.android.bindings.QtActivity}
  I/WindowState(  479): WIN DEATH: Window{64d0f6e0 u0 SurfaceView}
  I/UsageStats(  479): No package stats for pkg:org.qtproject.example
  I/art     (  118): Process 20157 terminated by signal (7)
  W/ActivityManager(  479): Exception thrown during pause
  W/ActivityManager(  479): android.os.DeadObjectException
  W/ActivityManager(  479):   at android.os.BinderProxy.transact(Native Method)
  W/ActivityManager(  479):   at android.app.ApplicationThreadProxy.schedulePauseActivity(ApplicationThreadNative.java:660)
  W/ActivityManager(  479):   at com.android.server.am.ActivityStack.startPausingLocked(ActivityStack.java:778)
  W/ActivityManager(  479):   at com.android.server.am.ActivityStack.finishActivityLocked(ActivityStack.java:2614)
  W/ActivityManager(  479):   at com.android.server.am.ActivityStack.finishTopRunningActivityLocked(ActivityStack.java:2488)
  W/ActivityManager(  479):   at com.android.server.am.ActivityStackSupervisor.finishTopRunningActivityLocked(ActivityStackSupervisor.java:2196)
  W/ActivityManager(  479):   at com.android.server.am.ActivityManagerService.handleAppCrashLocked(ActivityManagerService.java:9705)
  W/ActivityManager(  479):   at com.android.server.am.ActivityManagerService.makeAppCrashingLocked(ActivityManagerService.java:9598)
  W/ActivityManager(  479):   at com.android.server.am.ActivityManagerService.crashApplication(ActivityManagerService.java:10243)
  W/ActivityManager(  479):   at com.android.server.am.ActivityManagerService.handleApplicationCrashInner(ActivityManagerService.java:9794)
  W/ActivityManager(  479):   at com.android.server.am.NativeCrashListener$NativeCrashReporter.run(NativeCrashListener.java:86)
  D/ActivityManager(  479): resumeClassName is com.android.launcher2.Launcher
  D/ActivityManager(  479): resumePackageName is com.android.launcher
  I/ActivityManager(  479): Process org.qtproject.example (pid 20157) has died.
  D/ActivityManager(  479): send app_CRASH broadcast, packageName:org.qtproject.example
  </code></pre>
  
  <p>Much appreciated if anyone can help...</p>