Opened 18 years ago
Closed 18 years ago
#2822 closed patch (fixed)
Fix a segfault in livetv when switching from a digital to an analog channel
Reported by: | Owned by: | danielk | |
---|---|---|---|
Priority: | minor | Milestone: | unknown |
Component: | mythtv | Version: | head |
Severity: | low | Keywords: | |
Cc: | Ticket locked: | no |
Description
The problem is that when switching from a digital to an analog channel in livetv a segfault can occur. I ran this through gdb and noticed that the av_pause_frame.buf somehow became NULL when we where displaying the pause frame. This caused the segfault.
I looked through the code and noticed that the av_pause_frame.buf will always get cleared out when InputChanged?() is called (via a call to DeleteBuffers?()). The only way the pause frame will get recreated is if CreateBuffers?() is called (which ends up calling CreatePauseFrame?()). CreateBuffers?() is only called if we didn't change a codec_id (inside InputChanged?()). If the codec_id changes then we call InitSetupBuffers?(). InitSetupBuffers?() will not recreate the av_pause_frame.buf. Thus, we get the segfault noted above once we try to display a pause frame.
My patch will make InitSetupBuffers?() recreate the pause frame. I have tested a variant of this patch in .20 (only the VideoOutputSubType?() parameter passed is different) and I do not see the segfault anymore.
Jimmy
Attachments (3)
Change History (9)
Changed 18 years ago by
Attachment: | CreatePauseFrame_InitSetupBuffers.patch added |
---|
comment:1 Changed 18 years ago by
Owner: | changed from Isaac Richards to danielk |
---|
comment:2 Changed 18 years ago by
Resolution: | → worksforme |
---|---|
Status: | new → closed |
comment:3 Changed 18 years ago by
(In [12494]) Refs #2822. Cleans up PauseFrame? initialization, and clears it to black to avoid potential green screens.
comment:4 Changed 18 years ago by
comment:5 Changed 18 years ago by
Resolution: | worksforme |
---|---|
Status: | closed → reopened |
Okay, this is much tougher to reproduce then before, but I finally got it to crash. It actually happened in the same exact place as before (as I remember from my old crashes). I have attached 2 files: myth.log, gdb.txt.
Also, I included some local variable information from the debugger for the current stack frame:
Program received signal SIGSEGV, Segmentation fault. [Switching to Thread -1278170224 (LWP 29580)] 0x00c12d10 in VideoOutput::CopyFrame? (to=0xb6365a60, from=0xb63efe20) at videooutbase.cpp:1425 1425 memcpy(to->buf, from->buf, from->size);
print *to
$1 = {codec = FMT_RGB24, buf = 0x0, width = 640, height = 480, bpp = 12, size = 460802, frameNumber = 0, timecode = 0, priv = {0x0, 0x0, 0x0, 0x0}, qscale_table = 0x0, qstride = 0, interlaced_frame = 0, top_field_first = 0, repeat_pict = 0, forcekey = 0, pitches = {0, 0, 0}, offsets = {0, 0, 0}} (gdb) print *from $2 = {codec = FMT_YV12, buf = 0xb2fcb000 "", width = 640, height = 480, bpp = 12, size = 460802, frameNumber = 0, timecode = 0, priv = {0x0, 0x0, 0x0, 0x0}, qscale_table = 0x0, qstride = 0, interlaced_frame = 1, top_field_first = 1, repeat_pict = 0, forcekey = 0, pitches = {640, 320, 320}, offsets = {0, 307200, 384000}}
comment:6 Changed 18 years ago by
Resolution: | → fixed |
---|---|
Status: | reopened → closed |
jedynamic, the backtrace does not match up with SVN head.
Make sure you don't have one set of mythtv libs in /usr/lib and another in /usr/local/lib, and try doing a distclean before compiling & installing MythTV.
I can't reproduce this.
We shouldn't be calling UpdatePauseFrame? during the switch..
Please reopen if you can get a backtrace.