[mythtv] MARK_COMM_START, MARK_COMM_END
Robert Tsai
mythtv at tsaiberspace.net
Sun May 21 16:29:24 UTC 2006
I've implemented a new commercial flagger with a framework that should
make it easier to do the planned multi-threading improvements, as well
as to add more analysis algorithms with less boilerplate work
unrelated to actual video analysis. The flagger itself is a new type
returned by CommDetectorFactory::makeCommDetector, so it is safely
well outside of the current ClassicCommDetector code.
(This is independent and separable from Lucas' ClassicCommDetector
reorganization.)
I have a new logo-detector working, but I don't think I've got
integration with the database completely correct. I know the detection
itself is working based on my debugging output. However, the database
integration is not quite correct (the "marks" QMap that is supposed to
be returned by getCommercialBreakList). The symptoms are:
- In "Edit Recordings", the little hash marks are not
correctly aligned with the "red" bars denoting commercial
breaks. The red bars are correct; the hash marks are not
correct.
- When playing back a recording that has been subjected to my
new commercial flagger, commercials are forcibly skipped
over (despite the Auto-Skip being set to "off" or "notify").
Even if I attempt to rewind, the player simply skips over
the marked breaks.
This means that if the flagger is wrong, I can't rewind to
see what I missed, nor can I rewind if I actually want to
watch some movie trailer advertisement or something.
What I've done is to simply set marks[frameno] = MARK_COMM_START where
breaks begin, and set marks[frameno] = MARK_COMM_END where the content
starts up again.
Some direct questions:
- Which frame should be marked as MARK_COMM_END? The last
frame of the commercial break, or the first frame of the
content? If the latter, that means it is technically
impossible to represent a single-frame commercial-break; is
that intended? (I acknowledge that a single-frame break is
more likely a falsely-indicated break, so that this scenario
is not real-worldly expected to ever happen.)
- What am I doing wrong? :)
My code snippet reads ("isContent" is a routine that simply returns
whether the flagger believes a given frame is content or commercial;
"pass1" can be considered here to simply be an opaque blob of data):
/* Create break list. */
bool prevContent, thisContent;
if (!(prevContent = isContent(pass1, 0)))
marks[0] = MARK_COMM_START;
for (long long frameno = 1; frameno < nframes; frameno++)
{
if ((thisContent = isContent(pass1, frameno)) != prevContent)
{
marks[frameno] = thisContent ? MARK_COMM_END : MARK_COMM_START;
prevContent = thisContent;
}
}
if (!prevContent)
marks[nframes] = MARK_COMM_END;
I will be digging through ProgramInfo::SetMarkupMap to see exactly
what is going on, but I'm hoping to get a higher-level idea of what is
going on.
Thanks,
--Rob
More information about the mythtv-dev
mailing list