[mythtv-commits] Ticket #7083: Segfault in VideoOutputXv::PrepareFrameMem() with certain aspect ratios.

MythTV mythtv at cvs.mythtv.org
Thu Sep 17 04:25:51 UTC 2009


#7083: Segfault in VideoOutputXv::PrepareFrameMem() with certain aspect ratios.
-------------------------------------+--------------------------------------
 Reporter:  myth at jstenback.com       |       Owner:  janne  
     Type:  defect                   |      Status:  new    
 Priority:  major                    |   Milestone:  unknown
Component:  MythTV - Video Playback  |     Version:  head   
 Severity:  medium                   |     Mlocked:  0      
-------------------------------------+--------------------------------------
 When running mythfrontend in a window in a vnc session (for testing
 purposes), I noticed that with certain window sizes I get a segfault in
 VideoOutputXv::PrepareFrameMem(). The problem appears to be related to the
 allocation of the sbuf buffer in that method, if I double the size, the
 segfault goes away, but I get skewed video output (the bottom left corner
 is shifted over to being the bottom right corner, at a 45 degree angle, so
 something seems to be off by one pixel per line or somesuch). The
 allocation in question is this line:

 unsigned char *sbuf = new unsigned char[
     display_visible_rect.width() * display_visible_rect.height() * 3 / 2];

 The segfault is from deleting that buffer later on. I see the problem when
 I run mythfrontend in a window with the size 711x400px, if I change the
 size to 712x400, the segfault goes away.

 The mythtv version is as follows:

 MythTV Version   : 21870M
 MythTV Branch    : trunk
 Network Protocol : 48
 Library API      : 0.22.20090912-2
 QT Version       : 4.5.2
 Options compiled in:
  linux release using_oss using_alsa using_backend using_dvb using_frontend
 using_hdhomerun using_hdpvr using_iptv using_ivtv using_joystick_menu
 using_lirc using_mheg using_opengl_video using_opengl_vsync using_qtwebkit
 using_v4l using_x11 using_xrandr using_xv using_xvmc using_xvmc_vld
 using_xvmcw using_bindings_perl using_bindings_python using_opengl
 using_ffmpeg_threads using_live using_mheg

 This is all using the standard CPU+ playback profile.

 Valgrind had this to say about the segfault:

 ==14485==
 ==14485== Thread 11:
 ==14485== Invalid write of size 1
 ==14485==    at 0x6D28E3A: swScale_MMX2 (swscale.c:536)
 ==14485==    by 0x6D1E4B7: sws_scale (swscale.c:3206)
 ==14485==    by 0x56BAB40: VideoOutputXv::PrepareFrameMem(VideoFrame_*,
 FrameScanType) (videoout_xv.cpp:2207)
 ==14485==    by 0x56BB4E3: VideoOutputXv::PrepareFrame(VideoFrame_*,
 FrameScanType) (videoout_xv.cpp:2258)
 ==14485==    by 0x554E9BB: NuppelVideoPlayer::AVSync()
 (NuppelVideoPlayer.cpp:2489)
 ==14485==    by 0x5552DD8: NuppelVideoPlayer::DisplayNormalFrame()
 (NuppelVideoPlayer.cpp:2946)
 ==14485==    by 0x5553E22: NuppelVideoPlayer::OutputVideoLoop()
 (NuppelVideoPlayer.cpp:3085)
 ==14485==    by 0x5553F9D:
 NuppelVideoPlayer::kickoffOutputVideoLoop(void*)
 (NuppelVideoPlayer.cpp:3163)
 ==14485==    by 0x99EF3D9: start_thread (in /lib64/libpthread-2.9.so)
 ==14485==    by 0xC38D2BC: clone (in /lib64/libc-2.9.so)
 ==14485==  Address 0x2e0eadb0 is 0 bytes after a block of size 426,600
 alloc'd
 ==14485==    at 0x4C2561C: operator new[](unsigned long)
 (vg_replace_malloc.c:274)
 ==14485==    by 0x56BA604: VideoOutputXv::PrepareFrameMem(VideoFrame_*,
 FrameScanType) (videoout_xv.cpp:2176)
 ==14485==    by 0x56BB4E3: VideoOutputXv::PrepareFrame(VideoFrame_*,
 FrameScanType) (videoout_xv.cpp:2258)
 ==14485==    by 0x554E9BB: NuppelVideoPlayer::AVSync()
 (NuppelVideoPlayer.cpp:2489)
 ==14485==    by 0x5552DD8: NuppelVideoPlayer::DisplayNormalFrame()
 (NuppelVideoPlayer.cpp:2946)
 ==14485==    by 0x5553E22: NuppelVideoPlayer::OutputVideoLoop()
 (NuppelVideoPlayer.cpp:3085)
 ==14485==    by 0x5553F9D:
 NuppelVideoPlayer::kickoffOutputVideoLoop(void*)
 (NuppelVideoPlayer.cpp:3163)
 ==14485==    by 0x99EF3D9: start_thread (in /lib64/libpthread-2.9.so)
 ==14485==    by 0xC38D2BC: clone (in /lib64/libc-2.9.so)
 ==14485==
 ==14485== Invalid read of size 4
 ==14485==    at 0x6D2E720: yuv420_rgb16_MMX2 (yuv2rgb_template.c:193)
 ==14485==    by 0x6D1E4B7: sws_scale (swscale.c:3206)
 ==14485==    by 0x530906B: myth_sws_img_convert(AVPicture*, PixelFormat,
 AVPicture*, PixelFormat, int, int) (myth_imgconvert.cpp:54)
 ==14485==    by 0x56BAC01: VideoOutputXv::PrepareFrameMem(VideoFrame_*,
 FrameScanType) (videoout_xv.cpp:2219)
 ==14485==    by 0x56BB4E3: VideoOutputXv::PrepareFrame(VideoFrame_*,
 FrameScanType) (videoout_xv.cpp:2258)
 ==14485==    by 0x554E9BB: NuppelVideoPlayer::AVSync()
 (NuppelVideoPlayer.cpp:2489)
 ==14485==    by 0x5552DD8: NuppelVideoPlayer::DisplayNormalFrame()
 (NuppelVideoPlayer.cpp:2946)
 ==14485==    by 0x5553E22: NuppelVideoPlayer::OutputVideoLoop()
 (NuppelVideoPlayer.cpp:3085)
 ==14485==    by 0x5553F9D:
 NuppelVideoPlayer::kickoffOutputVideoLoop(void*)
 (NuppelVideoPlayer.cpp:3163)
 ==14485==    by 0x99EF3D9: start_thread (in /lib64/libpthread-2.9.so)
 ==14485==    by 0xC38D2BC: clone (in /lib64/libc-2.9.so)
 ==14485==  Address 0x2e0eadb0 is 0 bytes after a block of size 426,600
 alloc'd
 ==14485==    at 0x4C2561C: operator new[](unsigned long)
 (vg_replace_malloc.c:274)
 ==14485==    by 0x56BA604: VideoOutputXv::PrepareFrameMem(VideoFrame_*,
 FrameScanType) (videoout_xv.cpp:2176)
 ==14485==    by 0x56BB4E3: VideoOutputXv::PrepareFrame(VideoFrame_*,
 FrameScanType) (videoout_xv.cpp:2258)
 ==14485==    by 0x554E9BB: NuppelVideoPlayer::AVSync()
 (NuppelVideoPlayer.cpp:2489)
 ==14485==    by 0x5552DD8: NuppelVideoPlayer::DisplayNormalFrame()
 (NuppelVideoPlayer.cpp:2946)
 ==14485==    by 0x5553E22: NuppelVideoPlayer::OutputVideoLoop()
 (NuppelVideoPlayer.cpp:3085)
 ==14485==    by 0x5553F9D:
 NuppelVideoPlayer::kickoffOutputVideoLoop(void*)
 (NuppelVideoPlayer.cpp:3163)
 ==14485==    by 0x99EF3D9: start_thread (in /lib64/libpthread-2.9.so)
 ==14485==    by 0xC38D2BC: clone (in /lib64/libc-2.9.so)

 --14485-- VALGRIND INTERNAL ERROR: Valgrind received a signal 11 (SIGSEGV)
 - exiting
 --14485-- si_code=80;  Faulting address: 0x0;  sp: 0x410D46DD0

 Attached is also the output of:

   mythfrontend -w -geometry 711x400 -v playback

 of me attempting to play back a recording (720p H264, from an HD-PVR).

 Let me know if I can provide any additional information.

-- 
Ticket URL: <http://svn.mythtv.org/trac/ticket/7083>
MythTV <http://www.mythtv.org/>
MythTV


More information about the mythtv-commits mailing list