Question

I have been trying to decode the video stream from an AR.Drone 2.0 (http://ardrone2.parrot.com/) for a while now with no success. Despite several examples that I have been following closely (I'd paste links, but I am not allowed) I cannot escape a segmentation fault inside of the ffmpeg libavcodec library. I thought that perhaps I was making some kind of mistake in the multi-threaded structure I was building, so I cut out everything except the bare minimum you need to connect to the drone, collect a frame from the drone, and send it to ffmpeg's avcodec_decode_video2() function.

I compiled the ffmpeg source (I've actually tried three different releases!) and can get the ffplay utility to display the drone's video TCP stream. The video lags significantly, but at least I know the drone isn't sending me complete gibberish.

Has anyone encountered a problem like this before? What could be causing this segmentation fault, and what can I do about it? Is there a way to isolate a test on ffmpeg so that I can be sure it is the library and not something I've been doing this entire time?

Thanks for your time.

A pastebin with my code: http://pastebin.com/NYTf0NeT

Some details on my ffmpeg and compiler set up:

ffmpeg version 2.2.git Copyright (c) 2000-2014 the FFmpeg developers
  built on Mar  3 2014 18:05:42 with gcc 4.8 (Ubuntu 4.8.1-2ubuntu1~12.04)
  configuration: 
  libavutil      52. 66.100 / 52. 66.100
  libavcodec     55. 52.102 / 55. 52.102
  libavformat    55. 33.100 / 55. 33.100
  libavdevice    55. 10.100 / 55. 10.100
  libavfilter     4.  2.100 /  4.  2.100
  libswscale      2.  5.101 /  2.  5.101
  libswresample   0. 18.100 /  0. 18.100

The output of my code and a backtrace at the segmentation fault:

*********************** START ***********************



booting...

[h264 @ 0x604040] err{or,}_recognition separate: 1; 1

[h264 @ 0x604040] err{or,}_recognition combined: 1; 1

[h264 @ 0x604040] Unsupported bit depth: 0

asked for 40000 bytes, received packet of 1448 bytes

PaVE synchronized. YIPEEEEEEEEEEEEEEEEEEEEEEEE



---------------------------

Codec : H264

StreamID : 1 

Timestamp : 1031517 ms

Encoded dims : 640 x 368

Display dims : 640 x 360

Header size : 76

Payload size : 17583

Size of SPS inside payload : 14

Size of PPS inside payload : 10

Slices in the frame : 1

Frame Type / Number : IDR-Frame : 31467 : slide 1/1

---------------------------




gathering payload...

asked for 16211 bytes, received packet of 1448 bytes

gathering payload...

asked for 14763 bytes, received packet of 1448 bytes

gathering payload...

asked for 13315 bytes, received packet of 1448 bytes

gathering payload...

asked for 11867 bytes, received packet of 1448 bytes

gathering payload...

asked for 10419 bytes, received packet of 1448 bytes

gathering payload...

asked for 8971 bytes, received packet of 1448 bytes

gathering payload...

asked for 7523 bytes, received packet of 1448 bytes

gathering payload...

asked for 6075 bytes, received packet of 1448 bytes

gathering payload...

asked for 4627 bytes, received packet of 1448 bytes

gathering payload...

asked for 3179 bytes, received packet of 1448 bytes

gathering payload...

asked for 1731 bytes, received packet of 1448 bytes

gathering payload...

asked for 283 bytes, received packet of 283 bytes

payload complete, attempting to decode frame




Program received signal SIGSEGV, Segmentation fault.

0x00007ffff73fccba in ?? () from /usr/lib/x86_64-linux-gnu/libavcodec.so.53

(gdb) bt

#0  0x00007ffff73fccba in ?? () from /usr/lib/x86_64-linux-gnu/libavcodec.so.53

#1  0x00007ffff73fd8f5 in avcodec_decode_video2 () from /usr/lib/x86_64-linux-gnu/libavcodec.so.53

#2  0x000000000040159f in fetch_and_decode(int, parrot_video_encapsulation_t, AVCodecContext*, AVFrame*)

    ()

#3  0x00000000004019c6 in main ()

EDIT: I used Valgrind to try and get a better picture of the seg fault, and received the following:

==4730== Invalid read of size 1
==4730==    at 0x5265CBA: ??? (in /usr/lib/x86_64-linux-gnu/libavcodec.so.53.35.0)
==4730==    by 0x52668F4: avcodec_decode_video2 (in /usr/lib/x86_64-linux-gnu/libavcodec.so.53.35.0)
==4730==    by 0x40140E: fetch_and_decode(int, AVCodecContext*, AVFrame*) (main.cpp:176)
==4730==    by 0x401757: main (main.cpp:273)
==4730==  Address 0x280056c46f9 is not stack'd, malloc'd or (recently) free'd
==4730== 
==4730== 
==4730== Process terminating with default action of signal 11 (SIGSEGV)
==4730==  Access not within mapped region at address 0x280056C46F9
==4730==    at 0x5265CBA: ??? (in /usr/lib/x86_64-linux-gnu/libavcodec.so.53.35.0)
==4730==    by 0x52668F4: avcodec_decode_video2 (in /usr/lib/x86_64-linux-gnu/libavcodec.so.53.35.0)
==4730==    by 0x40140E: fetch_and_decode(int, AVCodecContext*, AVFrame*) (main.cpp:176)
==4730==    by 0x401757: main (main.cpp:273)

"Invalid read size of 1" refers to trying to access a byte outside the bounds of an array. Does this mean that the library is trying to access something outside the bounds of an array I'm giving it? I've checked the AVPkt, and that seems fine. I'm still stumped!

Was it helpful?

Solution

I eventually figured this out. The key thing to notice is the specific FFMPEG shared library file in the backtrace. That was not the new, manually-compiled-from-source version of the library. I was not properly linking to the updated file, but was instead linking to whatever kind of default there is on Ubuntu.

Fixing this required recompiling FFMPEG and making sure that I had properly linked to the correct shared library.

There were some other memory issues as well, but nothing segfaulting. I ironed some of those more minor things out and pasted the result here: http://pastebin.com/rLEKB5Va

This properly captures and displays the video.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top