DDMS和豌豆荚 ScreenCapture流程

本文介绍了Android4.1系统中DDMS和豌豆荚ScreenCapture的工作流程,重点讨论了screencap工具的使用以及在处理YUV数据时可能出现的问题。当相机预览或视频播放时,screencap可能无法正常显示。通过分析layer->drawForScreenshot()的调用,可以了解到该过程涉及到layerbase.cpp和layer.cpp中的ondraw函数,最终调用drawWithOpenGL进行渲染。若发现画面旋转问题,可在drawWithOpenGL中调整。同时推荐了一篇关于Framebuffer object的参考资料。
摘要由CSDN通过智能技术生成

chipset: MSM8x25Q

codebase:  Android4.1


Screencap和screenshot大同小异,不过前者是直接用build好的一个可执行文件来操作的,文件位于/system/bin/screencap。看下code:

int main(int argc, char** argv)
{
    const char* pname = argv[0];
    bool png = false;
    int c;
    while ((c = getopt(argc, argv, "ph")) != -1) {
        switch (c) {
            case 'p':
                png = true;
                break;
            case '?':
            case 'h':
                usage(pname);
                return 1;
        }
    }
    argc -= optind;
    argv += optind;

    int fd = -1;
    if (argc == 0) {
        fd = dup(STDOUT_FILENO);
} else if (argc == 1) {
		/*获取参数argv[0],为要保存screencap的path*/
        const char* fn = argv[0];
        fd = open(fn, O_WRONLY | O_CREAT | O_TRUNC, 0664);
        if (fd == -1) {
            fprintf(stderr, "Error opening file: %s (%s)\n", fn, strerror(errno));
            return 1;
        }
        const int len = strlen(fn);
		/*path file是否为png*/
        if (len >= 4 && 0 == strcmp(fn+len-4, ".png")) {
            png = true;
        }
    }
    
    if (fd == -1) {
        usage(pname);
        return 1;
    }

    void const* mapbase = MAP_FAILED;
    ssize_t mapsize = -1;

    void const* base = 0;
    uint32_t w, h, f;
    size_t size = 0;
ScreenshotClient screenshot;
/*最终通过SF的update去重画*/
if (screenshot.update() == NO_ERROR) {
		/*获得显示buffer的address*/
        base = screenshot.getPixels();
        w = screenshot.getWidth();
        h = screenshot.getHeight();
        f = screenshot.getFormat();
        size = screenshot.getSize();
        ALOGE("screencap w:%d, h:%d, f:%d, size:%d", w, h, f, size);
} else {
		/*上面用SF更新buffer失败的话就直接从fb中获得。*/
        const char* fbpath = "/dev/graphics/fb0";
        int fb = open(fbpath, O_RDONLY);
        if (fb >= 0) {
            struct fb_var_screeninfo vinfo;
            if (ioctl(fb, FBIOGET_VSCREENINFO, &vinfo) == 0) {
                uint32_t bytespp;
                if (vinfoToPixelFormat(vinfo, &byte
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值