Directdraw:旋转视频流

时间:2010-02-18 15:17:02

标签: c++ c windows-mobile camera directdraw

问题

Windows Mobile / Directdraw: Rotate video stream

视频预览正常工作,我现在需要的只是一种旋转图像的方法。我认为解决这个问题的唯一方法是编写一个基于CTransformFilter的自定义过滤器,它会为您旋转相机图像。如果你能帮我解决这个问题,例如通过帮助我利用我有限的DirectDraw知识开发这个过滤器,赏金就是你的。

背景/上一个问题

我目前正在开发移动设备应用程序(HTC HD2,Windows Mobile 6)。程序需要做的一件事是使用内置相机拍照。以前我使用Windows Mobile 6 SDK提供的CameraCaptureDialog做到了这一点,但我们的客户想要一个更加用户友好的解决方案。

想法是在控件中预览相机的视频流,并在单击控件时使用相机的照片功能拍摄高分辨率图片(> = 2百万像素)。我们对该主题进行了一些研究,发现实现这一目标的最佳方法似乎是使用Direct Draw。

缺点是我从未真正使用任何原生Windows API,而且我的C ++相当糟糕。除此之外,我在某处读到HTC手机的Direct Draw支持是特殊的,你将不得不使用未记录的原生HTC库调用来拍摄高质量的图片。

好消息是,一家公司向我们提供了开发符合上述规格的控制器。他们估计大约需要10天,如果我们能够在合理的时间内完成这项控制,就会引发讨论。

现在我的工作是研究哪种替代方案更好。毋庸置疑,研究整个architecture并开发演示的时间太少,这引出了以下问题:

问题不再相关!

  • 你们有没有相似项目的经验?你有什么建议?
  • 是否有一个很好的Direct Draw源代码示例处理视频预览和图像捕获?

2 个答案:

答案 0 :(得分:2)

如果您查看EZRGB24示例,您将获得简单视频转换滤镜的基础知识。

您需要对样本做两件事才能让它做你想做的事。

1)您需要将x,y复制到y,x 2)您需要告诉媒体样本现在样本是高度x宽度而不是宽度x高度。

请记住,最终图像的像素数将完全相同。

解决1比较简单。您可以通过执行“x +(y * Width)”来计算像素的位置。所以你逐步遍历每个x和y计算那个位置,然后把它写成“y +(x * Height)”。这将转置图像。当然没有step2,这看起来完全错了。

要解决2,您需要获取输入样本的AM_MEDIA_TYPE。然后,您需要找出formatType是什么(可能是FormatType_VideoInfo或FormatType_VideoInfo2)。因此,您可以将AM_MEDIA_TYPE的pbFormat成员强制转换为VIDEOINFOHEADER或VIDEOINFOHEADER2(取决于FormatType)。您现在需要将VIDEOINFOHEADER [2] :: bmiHeader.biWidth和biHeight设置为输入媒体样本的biHeight和biWidth(分别)。其他所有内容都应与输入AM_MEDIA_TYPE相同。

我希望有所帮助。

答案 1 :(得分:1)

这个question将帮助您获得有关DirectDraw的一些详细信息。我前段时间对此做了一些研究,我能找到的最好的是这个博客post(在上面的问题中也提到过)。该帖子提供了SDK中CameraCapture示例的扩展。

但是,没有很高的期望。似乎预览和拍摄的照片只能以小分辨率工作。尽管DirectDraw以describe的方式配置分辨率,但无法保证驱动程序能够正确实现此功能。

根据我的经验,你所读的是真的。唯一的方法是使用HTC驱动程序。因此,如果您不想在逆向工程中度过无尽的日子以获得可疑的结果,那就让其他人为您完成这项工作。如果你想试一试,试试xda-developers forum