[mythtv] Mythtv mpeg frame counting - patch?

Bill level42 at sympatico.ca
Sat Jun 16 02:53:11 UTC 2007


Thanks for the feedback, very helpful.  It does appear the problem I have is 
related to telecine.
The recordings are from DVB, they are movies with no commercials and they 
have been cut so there is no lead or tail just the movie.  So the frame rate 
I assume should be constant.

The pattern of the frame interlace (0),  repeat_pict (1010) and 
top_field_first (1001) bits every four frames matches the 3-2 sequence where 
the redundant frame has been drop or not transmitted.  This makes sense for 
DVB to save bandwidth, in the same way it is done for DVDs.  Because it 
hasn't been transmitted mythtv doesn't count it in 
AvFormatDecoder::GetFrame.  Because it isn't counted, the OSD length is 
reported wrong, because the mpeg header says the file is 29.97 fps assuming 
that the redundant frame is filled in at playback.  The OSD time is 
calculated based on the frame count and using the 29.97 fps from the header. 
But in reality, because the redundant frame isn't counted, the frame count 
really increments at a rate of 24 fps.  So the OSD time is in error by 
24/29.97.

I guess the easiest thing for me to do is patch the mpeg header to 24fps.  I 
don't think this will affect seeking or anything.

So I think this is really a different problem than described in Ticket #799. 
Because in this case Mythtv is in fact counting the frames correctly on both 
the recording side (record position map is good), and on the player side.

I assume the "double length" problem in #799 is because HDTV frames probably 
span two or more data packets, as mythtv counts packets, it counts twice for 
every frame.

These two problems could possibly be fixed in the same way.  As Daniel 
mentioned, a partial decode needs to be done to identify the frame 
boundaries in the packets, to count frames.  When we find the frame, we 
could check the frame interlace,  repeat_pict and top_field_first bits to 
see if need to increment the frame count by 5 for every 4 frames.  I hope 
that a lot of decoding isn't needed to see these bits, since this would add 
a lot of overhead.  I wonder if this might have some other side affects on 
playback cause AvFormatDecoder::GetFrame will need to count by two every 
four frames.

The second option for this particular problem maybe to leave the frame 
counting as it is (cause it works well otherwise; seeking works) and only 
fix the OSD display.  If we detect the four frame 3-2 sequence by the frame 
interlace,  repeat_pict and top_field_first bits, we assume the redundant 
frame has been dropped and adjust the OSD time accordingly.

Daniel how about the second option?  I can make a patch for this, I would 
prefer this to patching all my video headers, cause that will only fix 
videos under mythvideo, won't fix any new recordings I make.

For the original problem (#799) I had an idea to try to take some code from 
av_read_frame since it does partial parsing to return us exactly one video 
frame, and incorporate into the recorders.  But I haven't had time to check 
the av_read_frame code to see if this is practical.  In any case the problem 
I would have, is I can't test it, since I don't have HDTV and in my case 
mythtv is actually counting the frames correctly. 



More information about the mythtv-dev mailing list