Question about video capture and rendering and encoding in wine
m.b.lankhorst at gmail.com
Wed Jun 23 09:50:14 CDT 2010
2010/6/23 shenyue <shenyue at magima.com.cn>:
> Hi everyone,
> Previously I post this question on wine-user forum, seems nobody
> answered/interested, so I post it here. Hope somebody give me
> a hand :)
> I have some questions about wine video capture andrendering.
> I'm a newbie to wine, and am working on QQ or any other messengers in wine.
> My environment is : ubuntu 10.04, installed wine 1.1.42 (later when I modify
> code, wine-1.1.42's source instead), QQ2009. And during my debugging, I also
> check some source code from latest wine 1.2-rc4.
> Although QQ's level is "garbage", but fortunately it works almost fine under
> wine, including login, text chat, ..... But the video call can only
> partially work.I can see my friend's(he's under windows of course) video,
> while I can't see my preview video, and he cannot see mine video too.
> And no audio at all. (Audio is another issue, I haven't deal with it now.)
> As a comparison, I run GraphEdt to check what's wrong with video capture and
> rendering, my filter graph=video capture + video render. when I 'use clock',
> the same thing happens, no video rendering at all, but when I DONOT
> 'use clock', video rendering works fine.
> Then I read the source code and find out one problem(maybe right, maybe
> wrong), when wine/dlls/qcap/v4l.c send media samples to downstream filters,
> it do not set any timestamp on it. Thus if I use VideoRenderer as I did in
> GraphEdt, the video render got wrong start and stop reference time for
> media sample, and then the synchronisation result will be very strange.
> So I modify the v4l.c and set proper timestamp on media sample. Good result,
> even when I 'use clock', the capture+render graph works find in GraphEdt.
> But when I turn to QQ, my video capture+preview+encoding graph still seems
> don't work.
I only made it work for msn messenger a long time ago, in 6.2 or so.
I'm surprised it still works. Only change since then has been adding
support for libv4l. (v4l2 with v4l1 api)
> Then I checked msdn for these things, according to msdn:
> "Video frames from a preview pin (as opposed to a capture pin) are not time
> stamped. Because of graph latency, a video frame that is stamped with the
> capture time will always arrive late at the video renderer. This may cause
> the renderer to drop frames, in an attempt at quality control."
> "Quality control is a mechanism for adjusting the rate of data flow through
> the filter graph in response to run-time performance. If a renderer filter
> is receiving too much data or too little data, it can send a quality
> message. The quality message requests an adjustment in the data rate.
> By default, quality messages travel upstream from the renderer until
> they reach a filter that can respond (if any)."
> I've cheked winedbg log, QQ's filter graph looks like:
> vfw capture filter + QQ's own video render filter + ... + ddraw/d3d7
> QQ did not use smarttee, preview pin, standard VideoRender or
> VideoRenderDefault or VideoMixingRender9 (because QQ never query
> their id). Instead, I guess QQ write a video render filter by itself, and in
> QQ's render filter, it directly use ddraw/d3d7 surface to render, and maybe
> it does something similar to smarttee, to output to preview and encoding
> at the same time.
Could it be a ddraw/d3d7 failure rather than a wine failure?
> Since QQ did not use preview pin directly, at first I guess maybe 'not time
> stamped' is not correct, so I add some timestamp to capture's output
> video frame, still no preview occurs, but result in continuous
> IQualityControl interface query, but even latest wine-1.2-rc4 has not
> implemented IQualityControl, so I guess, still something wrong in
> timestamp synchronisation, and QQ's video render want to use
> IQualityControl to fix it which wine doesn't support, so maybe
> every frame is dropped, this result in my black preview video window.
> I read from wine docs/wiki, once before windows messenger (8.1?) worked fine
> in wine, I guess since you have written qcap/vfwcapture, of course somebody
> has used wine for camera+preview+maybe encoding before, why it succeeded
> by then, but fail now?
> Is there anything wrong for me?
Because originally I only wrote it to work with msn messenger 6.2 ;).
> Btw1: there's a bug in wine-1.1.42's dlls/quartz/memallocator.c,
> MediaSample's GetTime() return value is wrong, I've fixed that bug
> according to latest wine, but still no video preview, and my friend cannot
> see my video.
> Btw2: since qcap only works for v4l1, I ran flashcam to convert v4l2 to
> v4l1. But I still wondering, since Maarteen original code supports v4l2, why
> result in only support v4l1 (but not both v4l1 and v4l2)?
Sort of, I didn't adjust the code for v4l2, however with libv4l it
should work in linux..
More information about the wine-devel