Opened 20 years ago
Closed 20 years ago
#1423 closed defect (duplicate)
assert failure in CC708Decoder::decode_cc_data / parse_cc_packet
| Reported by: | Robert Tsai <rtsai1111> | Owned by: | Isaac Richards |
|---|---|---|---|
| Priority: | minor | Milestone: | unknown |
| Component: | mythtv | Version: | head |
| Severity: | medium | Keywords: | |
| Cc: | Ticket locked: | no |
Description
I have a slightly damaged OTA HD recording that triggers this assert when running mythcommflag against it; it looks like the data contains something unexpected:
(gdb) bt
#0 0x00002aaaae6480fd in raise () from /lib/libc.so.6
#1 0x00002aaaae64982e in abort () from /lib/libc.so.6
#2 0x00002aaaae6418d1 in __assert_fail () from /lib/libc.so.6
#3 0x00002aaaab20d212 in parse_cc_packet (cb_cbs=0x69fd38, pkt=0x6e9fe0)
at cc708decoder.cpp:584
#4 0x00002aaaab20d35d in CC708Decoder::decode_cc_data (this=0x6e9fe0,
cc_type=3, data1=195, data2=34) at cc708decoder.cpp:67
#5 0x00002aaaab3044e5 in decode_cc_atsc (s=0x706ff0, buf=0x2aaab5a5f02b "J",
sz=9379) at avformatdecoder.cpp:1548
#6 0x00002aaaabddb1b2 in mpeg_decode_user_data (avctx=0xffffffffffffffff,
buf=0x69d8 <Address 0x69d8 out of bounds>, buf_size=6) at mpeg12.c:2977
#7 0x00002aaaabddb66f in mpeg_decode_frame (avctx=0x706ff0, data=Variable "data" is not available.
)
at mpeg12.c:3150
#8 0x00002aaaabd256d7 in avcodec_decode_video (avctx=0x706ff0,
picture=0x7fffff835c60, got_picture_ptr=0x7fffff835e1c,
buf=0x2aaab5a5f010 "", buf_size=9406) at utils.c:948
#9 0x00002aaaab31330b in AvFormatDecoder::GetFrame (this=0x6e8f80,
onlyvideo=1) at avformatdecoder.cpp:2627
#10 0x00002aaaab2d4620 in NuppelVideoPlayer::GetFrameNormal (this=0x69fd30,
onlyvideo=1) at NuppelVideoPlayer.cpp:1020
#11 0x00002aaaab2d5278 in NuppelVideoPlayer::GetFrame (this=0x69fd30,
onlyvideo=1, unsafe=true) at NuppelVideoPlayer.cpp:1098
#12 0x00002aaaab2e5d37 in NuppelVideoPlayer::GetRawVideoFrame (this=0x69fd30,
frameNumber=-1) at NuppelVideoPlayer.cpp:4442
#13 0x0000000000425d17 in ClassicCommDetector::go (this=0x6e7630)
at ClassicCommDetector.cpp:350
#14 0x000000000040a88e in DoFlagCommercials (showPercentage=false,
fullSpeed=true, inJobQueue=true, nvp=0x69fd30, commDetectMethod=255)
at main.cpp:448
#15 0x000000000040c362 in FlagCommercials (chanid=@0x7fffff837eb0,
starttime=@0x7fffff837ea0) at main.cpp:624
#16 0x000000000040fcc2 in main (argc=3, argv=0x7fffff838308) at main.cpp:970
(gdb) l parse_cc_packet
556 }
557 #endif
558 parse_cc_service_stream(cc, service_num);
559 }
560
561 static void parse_cc_packet(CC708Reader* cb_cbs, CaptionPacket* pkt)
562 {
563 const unsigned char* pkt_buf = pkt->data;
564 const int pkt_size = pkt->size;
565 int off = 1;
566 int service_number = 0;
567 int block_data_offset = 0;
568 int len = ((((int)pkt_buf[0])&0x3f)*2-1)&0xff;
569 int seq_num = (((int)pkt_buf[0])>>6)&0x3;
570
571 #if DEBUG_CC_RAWPACKET
572 {
573 int j;
574 fprintf(stderr, "CC length(%2i) seq_num(%i) ", len, seq_num);
575 for (j = 0; j < pkt_size; j++)
576 fprintf(stderr, "0x%x ", pkt_buf[j]);
577 fprintf(stderr, "\n");
578 }
579 #else
580 (void) seq_num;
581 #endif
582
583 assert(pkt_size<127);
584 assert(len<128);
585
(gdb) p /x len
$17 = 0xff
(gdb) p /x pkt_buf[0]
$18 = 0x80
(gdb) p (((int)pkt_buf[0])&0x3f)*2-1
$19 = -1
I can't help debug this, but I can help test a patch, since I have a recording that seems to always trigger this assert failure. FWIW, this is last night's broadcast of Fox 24.
Change History (3)
Note:
See TracTickets
for help on using tickets.

(In [9210]) Fixes #1423. Fixes segfault by printing out debug info rather than crashing.