lqt_color.c
来自「这个库实现了录象功能」· C语言 代码 · 共 1,099 行 · 第 1/3 页
C
1,099 行
index_supported = 0; while(supported[index_supported] != LQT_COLORMODEL_NONE) { if(file->vtracks[track].stream_cmodel == supported[index_supported]) { ret = file->vtracks[track].stream_cmodel; break; } index_supported++; } if(ret == LQT_COLORMODEL_NONE) { index_supported = 0; best_conversion_price = 10; while(supported[index_supported] != LQT_COLORMODEL_NONE) { if(quicktime_writes_cmodel(file, supported[index_supported], track)) { conversion_price = get_conversion_price(file->vtracks[track].stream_cmodel, supported[index_supported]); if(conversion_price < best_conversion_price) { best_conversion_price = conversion_price; ret = supported[index_supported]; } } index_supported++; } } if(ret == LQT_COLORMODEL_NONE) { ret = BC_RGB888; } return ret; }int lqt_get_best_colormodel(quicktime_t * file, int track, int * supported) { if((track >= file->total_vtracks) || (track < 0)) return LQT_COLORMODEL_NONE; if(file->wr) return lqt_get_best_colormodel_encode(file, track, supported); else return lqt_get_best_colormodel_decode(file, track, supported); }static const int num_colormodels = sizeof(colormodel_table)/sizeof(colormodel_table[0])-1;const char * lqt_colormodel_to_string(int colormodel) { int i = 0; for(; i < num_colormodels; i++) if(colormodel_table[i].colormodel == colormodel) break; return colormodel_table[i].name; }int lqt_string_to_colormodel(const char * str) { int i = 0; for(; i < num_colormodels; i++) if(!strcmp(colormodel_table[i].name, str)) break; return colormodel_table[i].colormodel; }int lqt_num_colormodels() { return num_colormodels; }const char * lqt_get_colormodel_string(int index) { return colormodel_table[index].name; }int lqt_get_colormodel(int index) { return colormodel_table[index].colormodel; }static int get_bytes_per_line(int colormodel, int width) { switch(colormodel) { case BC_RGB565: case BC_BGR565: case BC_YUV422: case BC_YUV422P16: case BC_YUV444P16: return width * 2; break; case BC_BGR888: case BC_RGB888: return width * 3; break; case BC_BGR8888: case BC_RGBA8888: case BC_YUVA8888: return width * 4; break; case BC_RGB161616: return width * 6; break; case BC_RGBA16161616: return width * 8; break; default: return width; } }/* Allocate and free row_pointers for use with libquicktime */uint8_t ** lqt_rows_alloc(int width, int height, int colormodel, int * rowspan, int * rowspan_uv) { int bytes_per_line = 0; int i; int y_size = 0, uv_size = 0; uint8_t ** video_buffer; int sub_h = 0, sub_v = 0; /* Allocate frame buffer */ bytes_per_line = get_bytes_per_line(colormodel, width); if(cmodel_is_planar(colormodel)) { lqt_colormodel_get_chroma_sub(colormodel, &sub_h, &sub_v); if(*rowspan <= 0) *rowspan = bytes_per_line; if(*rowspan_uv <= 0) *rowspan_uv = *rowspan / sub_h; y_size = *rowspan * height; uv_size = (*rowspan_uv * height)/sub_v; video_buffer = malloc(3 * sizeof(unsigned char*)); video_buffer[0] = malloc(y_size + 2 * uv_size); video_buffer[1] = &(video_buffer[0][y_size]); video_buffer[2] = &(video_buffer[0][y_size+uv_size]); } else { video_buffer = malloc(height * sizeof(unsigned char*)); if(*rowspan <= 0) *rowspan = bytes_per_line; video_buffer[0] = malloc(height * bytes_per_line); for(i = 1; i < height; i++) video_buffer[i] = &(video_buffer[0][i*bytes_per_line]); } return video_buffer; }void lqt_get_default_rowspan(int colormodel, int width, int * rowspan, int * rowspan_uv) { int bytes_per_line; int sub_h = 0, sub_v = 0; bytes_per_line = get_bytes_per_line(colormodel, width); lqt_colormodel_get_chroma_sub(colormodel, &sub_h, &sub_v); *rowspan = bytes_per_line; if(lqt_colormodel_is_planar(colormodel)) { *rowspan_uv = bytes_per_line / sub_h; } }void lqt_rows_free(uint8_t ** rows) { free(rows[0]); free(rows); }void lqt_rows_copy(uint8_t **out_rows, uint8_t **in_rows, int width, int height, int in_rowspan, int in_rowspan_uv, int out_rowspan, int out_rowspan_uv, int colormodel) { uint8_t * src_ptr, *dst_ptr; int i; int sub_h = 0, sub_v = 0; int bytes_per_line; if(lqt_colormodel_is_planar(colormodel)) { lqt_colormodel_get_chroma_sub(colormodel, &sub_h, &sub_v); /* Luma plane */ src_ptr = in_rows[0]; dst_ptr = out_rows[0]; for(i = 0; i < height; i++) { memcpy(dst_ptr, src_ptr, width); src_ptr += in_rowspan; dst_ptr += out_rowspan; } /* Chroma planes */ src_ptr = in_rows[1]; dst_ptr = out_rows[1]; for(i = 0; i < height/sub_v; i++) { memcpy(dst_ptr, src_ptr, width/sub_h); src_ptr += in_rowspan_uv; dst_ptr += out_rowspan_uv; } src_ptr = in_rows[2]; dst_ptr = out_rows[2]; for(i = 0; i < height/sub_v; i++) { memcpy(dst_ptr, src_ptr, width/sub_h); src_ptr += in_rowspan_uv; dst_ptr += out_rowspan_uv; } } else /* Packed */ { /* This is nasty: We don't know, how the frames are allocated. We test rows[1] to check this and handle all 4 combinations separately */ bytes_per_line = get_bytes_per_line(colormodel, width); if(in_rows[1] && out_rows[1]) { for(i = 0; i < height; i++) memcpy(out_rows[i], in_rows[i], bytes_per_line); } else if(in_rows[1]) { dst_ptr = out_rows[0]; for(i = 0; i < height; i++) { memcpy(dst_ptr, in_rows[i], bytes_per_line); dst_ptr += out_rowspan; } } else if(out_rows[1]) { src_ptr = in_rows[0]; for(i = 0; i < height; i++) { memcpy(out_rows[i], src_ptr, bytes_per_line); src_ptr += in_rowspan; } } else { src_ptr = in_rows[0]; dst_ptr = out_rows[0]; for(i = 0; i < height; i++) { memcpy(dst_ptr, src_ptr, bytes_per_line); src_ptr += in_rowspan; dst_ptr += out_rowspan; } } } }// for i in BC_RGB565 BC_BGR565 BC_BGR888 BC_BGR8888 BC_RGB888 BC_RGBA8888 BC_RGB161616 BC_RGBA16161616 BC_YUVA8888 BC_YUV422 BC_YUV420P BC_YUV422P BC_YUV444P BC_YUV411P BC_YUVJ420P BC_YUVJ422P BC_YUVJ444P BC_YUV422P16 BC_YUV444P16; do for j in BC_RGB565 BC_BGR565 BC_BGR888 BC_BGR8888 BC_RGB888 BC_RGBA8888 BC_RGB161616 BC_RGBA16161616 BC_YUVA8888 BC_YUV422 BC_YUV420P BC_YUV422P BC_YUV444P BC_YUV411P BC_YUVJ420P BC_YUVJ422P BC_YUVJ444P BC_YUV422P16 BC_YUV444P16; do echo $i"_to_"$j.png; gthumb $i"_to_"$j.png; done; doneint lqt_colormodel_has_conversion(int in_cmodel, int out_cmodel) { if(in_cmodel == out_cmodel) return 1; switch(in_cmodel) { case BC_RGB565: switch(out_cmodel) { case BC_BGR565: return 0; break; case BC_BGR888: return 0; break; case BC_BGR8888: return 0; break; case BC_RGB888: return 1; break; case BC_RGBA8888: return 0; break; case BC_RGB161616: return 0; break; case BC_RGBA16161616: return 0; break; case BC_YUVA8888: return 0; break; case BC_YUV422: return 0; break; case BC_YUV420P: return 0; break; case BC_YUV422P: return 0; break; case BC_YUV444P: return 0; break; case BC_YUV411P: return 0; break; case BC_YUVJ420P: return 0; break; case BC_YUVJ422P: return 0; break; case BC_YUVJ444P: return 0; break; case BC_YUV422P16: return 0; break; case BC_YUV444P16: return 0; break; } break; case BC_BGR565: switch(out_cmodel) { case BC_RGB565: return 0; break; case BC_BGR888: return 0; break; case BC_BGR8888: return 0; break; case BC_RGB888: return 1; break; case BC_RGBA8888: return 0; break; case BC_RGB161616: return 0; break; case BC_RGBA16161616: return 0; break; case BC_YUVA8888: return 0; break; case BC_YUV422: return 0; break; case BC_YUV420P: return 0; break; case BC_YUV422P: return 0; break; case BC_YUV444P: return 0; break; case BC_YUV411P: return 0; break; case BC_YUVJ420P: return 0; break; case BC_YUVJ422P: return 0; break; case BC_YUVJ444P: return 0; break; case BC_YUV422P16: return 0; break; case BC_YUV444P16: return 0; break; } break; case BC_BGR888: switch(out_cmodel) { case BC_RGB565: return 1; break; case BC_BGR565: return 1; break; case BC_BGR8888: return 1; break; case BC_RGB888: return 1; break; case BC_RGBA8888: return 1; break; case BC_RGB161616: return 1; break; case BC_RGBA16161616: return 1; break; case BC_YUVA8888: return 1; break; case BC_YUV422: return 1; break; case BC_YUV420P: return 1; break; case BC_YUV422P: return 1; break; case BC_YUV444P: return 1; break; case BC_YUV411P: return 0; break; case BC_YUVJ420P: return 0; break; case BC_YUVJ422P: return 0; break; case BC_YUVJ444P: return 0; break; case BC_YUV422P16: return 0; break; case BC_YUV444P16: return 0; break; } break; case BC_BGR8888: switch(out_cmodel) { case BC_RGB565: return 0; break; case BC_BGR565: return 0; break; case BC_BGR888: return 0; break; case BC_RGB888: return 1; break;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?