On 12.10.2014 16:30, Chris Mayo wrote:
I occasionally see vdr crashing when a recording starts like this: kernel: traps: recording[352] trap divide error ip:4cfeff sp:7fc8e9523e00 error:0 in vdr[400000+156000] runvdr[300]: Floating point exception $ gdb /usr/bin/vdr (gdb) disass /m 0x4cfeff 1514 in remux.c 0x00000000004cfee6 <+870>: mov 0x290(%rbx),%rsi 0x00000000004cfeed <+877>: xor %edx,%edx 0x00000000004cfeef <+879>: mov 0x284(%rbx),%ecx 0x00000000004cfef5 <+885>: mov 0xc(%rbx),%eax 0x00000000004cfefc <+892>: add 0xc(%rsi),%ecx 0x00000000004cfeff <+895>: div %ecx 0x00000000004cff08 <+904>: mov %eax,%ecx Point to this in remux.c? 1514: uint32_t Delta = ptsValues[0] / (framesPerPayloadUnit + parser->IFrameTemporalReferenceOffset());
This should fix it: --- remux.c 2014/03/08 15:10:24 2.75.1.5 +++ remux.c 2014/04/13 13:59:21 2.75.1.6 @@ -1511,7 +1511,12 @@ for (int i = 0; i < numPtsValues; i++) ptsValues[i] = ptsValues[i + 1] - ptsValues[i]; qsort(ptsValues, numPtsValues, sizeof(uint32_t), CmpUint32); - uint32_t Delta = ptsValues[0] / (framesPerPayloadUnit + parser->IFrameTemporalReferenceOffset()); + int Div = framesPerPayloadUnit; + if (framesPerPayloadUnit > 1) + Div += parser->IFrameTemporalReferenceOffset(); + if (Div <= 0) + Div = 1; + uint32_t Delta = ptsValues[0] / Div; // determine frame info: if (isVideo) { if (abs(Delta - 3600) <= 1) Klaus _______________________________________________ vdr mailing list vdr@xxxxxxxxxxx http://www.linuxtv.org/cgi-bin/mailman/listinfo/vdr