+#include "thread.h"
+
+static int64_t get_raw_size(enum AVPixelFormat fmt, int width, int height)
+{
+ switch (fmt) {
+ case AV_PIX_FMT_RGB555LE:
+ case AV_PIX_FMT_RGB565LE:
+ return width * height * 2LL;
+ case AV_PIX_FMT_RGB24:
+ case AV_PIX_FMT_BGR24:
+ case AV_PIX_FMT_YUV444P:
+ return width * height * 3LL;
+ case AV_PIX_FMT_YUV420P:
+ return (int64_t)(width * height) + 2 * AV_CEIL_RSHIFT(width, 1) * AV_CEIL_RSHIFT(height, 1);
+ case AV_PIX_FMT_YUV410P:
+ return (int64_t)(width * height) + 2 * AV_CEIL_RSHIFT(width, 2) * AV_CEIL_RSHIFT(height, 2);
+ }
+
+ return 0;
+}
+
+static void do_vflip(AVCodecContext *avctx, AVFrame *pic, int vflip)
+{
+ if (!vflip)
+ return;
+
+ switch (pic->format) {
+ case AV_PIX_FMT_YUV444P:
+ pic->data[1] += (avctx->height - 1) * pic->linesize[1];
+ pic->linesize[1] = -pic->linesize[1];
+ pic->data[2] += (avctx->height - 1) * pic->linesize[2];
+ pic->linesize[2] = -pic->linesize[2];
+ case AV_PIX_FMT_RGB555LE:
+ case AV_PIX_FMT_RGB565LE:
+ case AV_PIX_FMT_BGR24:
+ case AV_PIX_FMT_RGB24:
+ pic->data[0] += (avctx->height - 1) * pic->linesize[0];
+ pic->linesize[0] = -pic->linesize[0];
+ break;
+ case AV_PIX_FMT_YUV410P:
+ pic->data[0] += (avctx->height - 1) * pic->linesize[0];
+ pic->linesize[0] = -pic->linesize[0];
+ pic->data[1] += (AV_CEIL_RSHIFT(avctx->height, 2) - 1) * pic->linesize[1];
+ pic->linesize[1] = -pic->linesize[1];
+ pic->data[2] += (AV_CEIL_RSHIFT(avctx->height, 2) - 1) * pic->linesize[2];
+ pic->linesize[2] = -pic->linesize[2];
+ break;
+ case AV_PIX_FMT_YUV420P:
+ pic->data[0] += (avctx->height - 1) * pic->linesize[0];
+ pic->linesize[0] = -pic->linesize[0];
+ pic->data[1] += (AV_CEIL_RSHIFT(avctx->height, 1) - 1) * pic->linesize[1];
+ pic->linesize[1] = -pic->linesize[1];
+ pic->data[2] += (AV_CEIL_RSHIFT(avctx->height, 1) - 1) * pic->linesize[2];
+ pic->linesize[2] = -pic->linesize[2];
+ break;
+ }
+}