colormodels.c
来自「这个库实现了录象功能」· C语言 代码 · 共 298 行
C
298 行
/******************************************************************************* colormodels.c libquicktime - A library for reading and writing quicktime/avi/mp4 files. http://libquicktime.sourceforge.net Copyright (C) 2002 Heroine Virtual Ltd. Copyright (C) 2002-2007 Members of the libquicktime project. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA*******************************************************************************/ #include "lqt_private.h"#include <quicktime/colormodels.h>#include <stdlib.h>int cmodel_is_planar(int colormodel){ switch(colormodel) { case BC_YUV420P: return 1; break; case BC_YUV422P: return 1; break; case BC_YUV444P: return 1; break; case BC_YUV422P16: return 1; break; case BC_YUV444P16: return 1; break; case BC_YUVJ420P: return 1; break; case BC_YUVJ422P: return 1; break; case BC_YUVJ444P: return 1; break; case BC_YUV411P: return 1; break; } return 0;}int cmodel_calculate_pixelsize(int colormodel){ switch(colormodel) { case BC_COMPRESSED: return 1; break; case BC_RGB565: return 2; break; case BC_BGR565: return 2; break; case BC_BGR888: return 3; break; case BC_BGR8888: return 4; break;// Working bitmaps are packed to simplify processing case BC_RGB888: return 3; break; case BC_RGBA8888: return 4; break; case BC_RGB161616: return 6; break; case BC_RGBA16161616: return 8; break; case BC_YUVA8888: return 4; break;// Planar case BC_YUV420P: return 1; break; case BC_YUV422P: return 1; break; case BC_YUV444P: return 1; break; case BC_YUVJ420P: return 1; break; case BC_YUVJ422P: return 1; break; case BC_YUVJ444P: return 1; break; case BC_YUV422P16: return 2; break; case BC_YUV444P16: return 2; break; case BC_YUV422: return 2; break; case BC_YUV411P: return 1; break; } return 0;}static void get_scale_tables(int **column_table, int **row_table, int in_x1, int in_y1, int in_x2, int in_y2, int out_x1, int out_y1, int out_x2, int out_y2){ int i; float w_in = in_x2 - in_x1; float h_in = in_y2 - in_y1; int w_out = out_x2 - out_x1; int h_out = out_y2 - out_y1; float hscale = w_in / w_out; float vscale = h_in / h_out; (*column_table) = malloc(sizeof(int) * w_out); (*row_table) = malloc(sizeof(int) * h_out); for(i = 0; i < w_out; i++) { (*column_table)[i] = (int)(hscale * i) + in_x1; } for(i = 0; i < h_out; i++) { (*row_table)[i] = (int)(vscale * i) + in_y1; }}void cmodel_transfer(unsigned char **output_rows, unsigned char **input_rows, int in_x, int in_y, int in_w, int in_h, int out_w, int out_h, int in_colormodel, int out_colormodel, int in_rowspan, int out_rowspan, int in_rowspan_uv, int out_rowspan_uv){ int *column_table; int *row_table; int scale; int in_pixelsize = cmodel_calculate_pixelsize(in_colormodel); int out_pixelsize = cmodel_calculate_pixelsize(out_colormodel);// Get scaling scale = (out_w != in_w) || (in_x != 0); get_scale_tables(&column_table, &row_table, in_x, in_y, in_x + in_w, in_y + in_h, 0, 0, out_w, out_h);// Handle planar cmodels separately switch(in_colormodel) { case BC_YUV420P: case BC_YUV422P: case BC_YUV422P16: case BC_YUVJ420P: case BC_YUVJ422P: cmodel_yuv420p(output_rows, \ input_rows, \ in_x, \ in_y, \ in_w, \ in_h, \ out_w, \ out_h, \ in_colormodel, \ out_colormodel, \ in_rowspan, \ out_rowspan, \ in_rowspan_uv, \ out_rowspan_uv, \ scale, \ out_pixelsize, \ in_pixelsize, \ row_table, \ column_table); \ break; \ case BC_YUV411P: cmodel_yuv411p(output_rows, \ input_rows, \ in_x, \ in_y, \ in_w, \ in_h, \ out_w, \ out_h, \ in_colormodel, \ out_colormodel, \ in_rowspan, \ out_rowspan, \ in_rowspan_uv, \ out_rowspan_uv, \ scale, \ out_pixelsize, \ in_pixelsize, \ row_table, \ column_table); \ break; \ case BC_YUV444P: case BC_YUV444P16: case BC_YUVJ444P: cmodel_yuv444p(output_rows, \ input_rows, \ in_x, \ in_y, \ in_w, \ in_h, \ out_w, \ out_h, \ in_colormodel, \ out_colormodel, \ in_rowspan, \ out_rowspan, \ in_rowspan_uv, \ out_rowspan_uv, \ scale, \ out_pixelsize, \ in_pixelsize, \ row_table, \ column_table); \ break; case BC_YUV422: cmodel_yuv422(output_rows, \ input_rows, \ in_x, \ in_y, \ in_w, \ in_h, \ out_w, \ out_h, \ in_colormodel, \ out_colormodel, \ in_rowspan, \ out_rowspan, \ in_rowspan_uv, \ out_rowspan_uv, \ scale, \ out_pixelsize, \ in_pixelsize, \ row_table, \ column_table); break; default: cmodel_default(output_rows, \ input_rows, \ in_x, \ in_y, \ in_w, \ in_h, \ out_w, \ out_h, \ in_colormodel, \ out_colormodel, \ in_rowspan, \ out_rowspan, \ in_rowspan_uv, \ out_rowspan_uv, \ scale, \ out_pixelsize, \ in_pixelsize, \ row_table, \ column_table); break; } free(column_table); free(row_table);}int cmodel_bc_to_x(int color_model){ switch(color_model) { case BC_YUV420P: return FOURCC_YV12; break; case BC_YUV422: return FOURCC_YUV2; break; } return -1;}int cmodel_is_yuv(int colormodel){ switch(colormodel) { case BC_YUVA8888: case BC_YUV422: case BC_YUVJ422P: case BC_YUV420P: case BC_YUV422P: case BC_YUV444P: case BC_YUV411P: return 1; break; default: return 0; break; }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?