2015년 9월 18일 금요일

Get current timestamp in milliseconds (UTC)



    struct timeval tp;
    gettimeofday(&tp, NULL);
    long long ms = (long long) tp.tv_sec * 1000L + tp.tv_usec / 1000; //get current timestamp in milliseconds

2015년 9월 8일 화요일

[FFMPEG] RGB <-> YUV



    int imgWidth = 320, imgHeight = 240;
    AVPicture rgbPic, yuvPic;

    int dataSize = imgWidth * imgHeight;
    
    avpicture_fill(&rgbPic, NULL, PIX_FMT_RGB24, imgWidth, imgHeight);
    rgbPic.data[0] = (uint8_t *) malloc(dataSize * 3);
    
    avpicture_fill(&yuvPic, NULL, PIX_FMT_YUV420P, imgWidth, imgHeight);
    yuvPic.data[0] = (uint8_t *) malloc(dataSize * 3 / 2);
    yuvPic.data[1] = yuvPic.data[0] + dataSize;
    yuvPic.data[2] = yuvPic.data[1] + dataSize / 4;
    
    // RGB888 to YUV420
    {
        SwsContext *rgb_to_yuv_ctx = sws_getContext(
                imgWidth, imgHeight, PIX_FMT_RGB24
                , imgWidth, imgHeight, PIX_FMT_YUV420P
                , SWS_BICUBIC, NULL, NULL, NULL);
        sws_scale(rgb_to_yuv_ctx
                , rgbPic.data, rgbPic.linesize, 0, imgHeight
                , yuvPic.data, yuvPic.linesize);
        sws_freeContext(rgb_to_yuv_ctx);
    }

    // YUV420 to RGB888
    {
        SwsContext *yuv_to_rgb_ctx = sws_getContext(
                imgWidth, imgHeight, PIX_FMT_YUV420P
                , imgWidth, imgHeight, PIX_FMT_RGB24
                , SWS_BICUBIC, NULL, NULL, NULL);
        sws_scale(yuv_to_rgb_ctx
                , yuvPic.data, yuvPic.linesize, 0, imgHeight
                , rgbPic.data, rgbPic.linesize);
        sws_freeContext(yuv_to_rgb_ctx);
    }