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 + -
显示快捷键?