int read_yuv_frame(struct VpxInputContext *input_ctx, vpx_image_t *yuv_frame) { FILE *f = input_ctx->file; struct FileTypeDetectionBuffer *detect = &input_ctx->detect; int plane = 0; int shortread = 0; const int bytespp = (yuv_frame->fmt & VPX_IMG_FMT_HIGHBITDEPTH) ? 2 : 1; for (plane = 0; plane < 3; ++plane) { uint8_t *ptr; const int w = vpx_img_plane_width(yuv_frame, plane); const int h = vpx_img_plane_height(yuv_frame, plane); int r; /* Determine the correct plane based on the image format. The for-loop * always counts in Y,U,V order, but this may not match the order of * the data on disk. */ switch (plane) { case 1: ptr = yuv_frame->planes[ yuv_frame->fmt == VPX_IMG_FMT_YV12 ? VPX_PLANE_V : VPX_PLANE_U]; break; case 2: ptr = yuv_frame->planes[ yuv_frame->fmt == VPX_IMG_FMT_YV12 ? VPX_PLANE_U : VPX_PLANE_V]; break; default: ptr = yuv_frame->planes[plane]; } for (r = 0; r < h; ++r) { size_t needed = w * bytespp; size_t buf_position = 0; const size_t left = detect->buf_read - detect->position; if (left > 0) { const size_t more = (left < needed) ? left : needed; memcpy(ptr, detect->buf + detect->position, more); buf_position = more; needed -= more; detect->position += more; } if (needed > 0) { shortread |= (fread(ptr + buf_position, 1, needed, f) < needed); } ptr += yuv_frame->stride[plane]; } } return shortread; }
static void write_image_file(const vpx_image_t *img, const int planes[3], FILE *file) { int i, y; for (i = 0; i < 3; ++i) { const int plane = planes[i]; const unsigned char *buf = img->planes[plane]; const int stride = img->stride[plane]; const int w = vpx_img_plane_width(img, plane); const int h = vpx_img_plane_height(img, plane); for (y = 0; y < h; ++y) { fwrite(buf, 1, w, file); buf += stride; } } }
static void update_image_md5(const vpx_image_t *img, const int planes[3], MD5Context *md5) { int i, y; for (i = 0; i < 3; ++i) { const int plane = planes[i]; const unsigned char *buf = img->planes[plane]; const int stride = img->stride[plane]; const int w = vpx_img_plane_width(img, plane); const int h = vpx_img_plane_height(img, plane); for (y = 0; y < h; ++y) { MD5Update(md5, buf, w); buf += stride; } } }
static void write_image_file(const vpx_image_t *img, const int planes[3], FILE *file) { int i, y; #if CONFIG_VP9 && CONFIG_VP9_HIGHBITDEPTH const int bytes_per_sample = ((img->fmt & VPX_IMG_FMT_HIGHBITDEPTH) ? 2 : 1); #else const int bytes_per_sample = 1; #endif for (i = 0; i < 3; ++i) { const int plane = planes[i]; const unsigned char *buf = img->planes[plane]; const int stride = img->stride[plane]; const int w = vpx_img_plane_width(img, plane); const int h = vpx_img_plane_height(img, plane); for (y = 0; y < h; ++y) { fwrite(buf, bytes_per_sample, w, file); buf += stride; } } }