texttrack.c

来自「这个库实现了录象功能」· C语言 代码 · 共 537 行 · 第 1/2 页

C
537
字号
    ref_track = file->atracks[0].track;  else    {    lqt_log(file, LQT_LOG_ERROR, LOG_DOMAIN,            "Need at least one audio or video stream for chapters");    return;    }  quicktime_tref_init_chap(&ref_track->tref, trak->tkhd.track_id);  ref_track->has_tref = 1;  }int lqt_write_text(quicktime_t * file, int track, const char * text,                   int64_t duration)  {  const char * charset;  const char * charset_fallback;  quicktime_text_map_t * ttrack;  quicktime_trak_t     * trak;  quicktime_atom_t       chunk_atom;  int out_len;    ttrack = &file->ttracks[track];  trak = ttrack->track;  /* Issue a warning for AVI files (No subitles are supported here) */  if(file->file_type & (LQT_FILE_AVI|LQT_FILE_AVI_ODML))    {    lqt_log(file, LQT_LOG_ERROR, LOG_DOMAIN,            "Subtitles are not supported in AVI files");    return 1;    }    if(!ttrack->initialized)    {    /* Create character set converter */    if(file->file_type & (LQT_FILE_QT_OLD|LQT_FILE_QT))      {      charset = lqt_get_charset(trak->mdia.mdhd.language,                                file->file_type);      charset_fallback = lqt_get_charset_fallback(trak->mdia.mdhd.language,                                         file->file_type);      if(!charset && !charset_fallback)        {        lqt_log(file, LQT_LOG_ERROR, LOG_DOMAIN,                "Subtitles character set could not be determined, string will be copied verbatim");        }      else        {        if(charset)          ttrack->cnv = lqt_charset_converter_create(file, "UTF-8", charset);        if(!ttrack->cnv && charset_fallback)          ttrack->cnv = lqt_charset_converter_create(file, "UTF-8", charset_fallback);                if(!ttrack->cnv)          {          lqt_log(file, LQT_LOG_ERROR, LOG_DOMAIN,                  "Unsupported character set in text track, string will be copied verbatim");          }        }      }        /* Set up chapter track */    if(ttrack->is_chapter_track)      make_chapter_track(file, trak);    ttrack->initialized = 1;    }  quicktime_write_chunk_header(file, trak, &chunk_atom);  if(text)    {    if(ttrack->cnv)      {      lqt_charset_convert_realloc(ttrack->cnv,                                  text, -1,                                  &ttrack->text_buffer, &ttrack->text_buffer_alloc,                                  &out_len);      quicktime_write_int16(file, out_len);      quicktime_write_data(file, (uint8_t*)ttrack->text_buffer, out_len);      }    else      {      out_len = strlen(text);            quicktime_write_int16(file, out_len);      quicktime_write_data(file, (uint8_t*)text, out_len);      }    }  else    {    quicktime_write_int16(file, 0);    }    quicktime_write_chunk_footer(file, trak, ttrack->current_chunk,                               &chunk_atom, 1);  quicktime_update_stts(&trak->mdia.minf.stbl.stts, ttrack->current_position, duration);    ttrack->current_chunk++;  ttrack->current_position++;  return 0;  }/* Rectangle */void lqt_set_text_box(quicktime_t * file, int track,                      uint16_t top, uint16_t left,                      uint16_t bottom, uint16_t right)  {  quicktime_trak_t      * trak;  quicktime_stsd_table_t * stsd;  trak = file->ttracks[track].track;  stsd = &trak->mdia.minf.stbl.stsd.table[0];  if(quicktime_match_32(stsd->format, "text"))    {    trak->tkhd.matrix.values[6] += (float)left;    trak->tkhd.matrix.values[7] += (float)top;    trak->tkhd.track_width  = right - left;    trak->tkhd.track_height = bottom - top;    }  else if(quicktime_match_32(stsd->format, "tx3g"))    {    trak->tkhd.track_width  = right - left;    trak->tkhd.track_height = bottom - top;        stsd->tx3g.defaultTextBox[0] = top;    stsd->tx3g.defaultTextBox[1] = left;    stsd->tx3g.defaultTextBox[2] = bottom;    stsd->tx3g.defaultTextBox[3] = right;    }  }void lqt_get_text_box(quicktime_t * file, int track,                      uint16_t * top, uint16_t * left,                      uint16_t * bottom, uint16_t * right)  {  quicktime_trak_t      * trak;  quicktime_stsd_table_t * stsd;  trak = file->ttracks[track].track;  stsd = &trak->mdia.minf.stbl.stsd.table[0];    if(quicktime_match_32(stsd->format, "text"))    {    *top    = stsd->text.defaultTextBox[0];    *left   = stsd->text.defaultTextBox[1];    *bottom = stsd->text.defaultTextBox[2];    *right  = stsd->text.defaultTextBox[3];    }  else if(quicktime_match_32(stsd->format, "tx3g"))    {    *top    = stsd->tx3g.defaultTextBox[0];    *left   = stsd->tx3g.defaultTextBox[1];    *bottom = stsd->tx3g.defaultTextBox[2];    *right  = stsd->tx3g.defaultTextBox[3];    }  }void lqt_set_text_fg_color(quicktime_t * file, int track,                           uint16_t r, uint16_t g,                           uint16_t b, uint16_t a)  {  quicktime_trak_t      * trak;  quicktime_stsd_table_t * stsd;  trak = file->ttracks[track].track;  stsd = &trak->mdia.minf.stbl.stsd.table[0];  if(quicktime_match_32(stsd->format, "text"))    {    stsd->text.scrpColor[0] = r;    stsd->text.scrpColor[1] = g;    stsd->text.scrpColor[2] = b;    }  else if(quicktime_match_32(stsd->format, "tx3g"))    {    stsd->tx3g.text_color[0] = r >> 8;    stsd->tx3g.text_color[1] = g >> 8;    stsd->tx3g.text_color[2] = b >> 8;    stsd->tx3g.text_color[3] = a >> 8;    }  }  void lqt_set_text_bg_color(quicktime_t * file, int track,                           uint16_t r, uint16_t g,                           uint16_t b, uint16_t a)  {  quicktime_trak_t      * trak;  quicktime_stsd_table_t * stsd;  trak = file->ttracks[track].track;  stsd = &trak->mdia.minf.stbl.stsd.table[0];  if(quicktime_match_32(stsd->format, "text"))    {    stsd->text.bgColor[0] = r;    stsd->text.bgColor[1] = g;    stsd->text.bgColor[2] = b;    if(a < 0x8000)      stsd->text.displayFlags |= 0x4000;    }  else if(quicktime_match_32(stsd->format, "tx3g"))    {    stsd->tx3g.back_color[0] = r >> 8;    stsd->tx3g.back_color[1] = g >> 8;    stsd->tx3g.back_color[2] = b >> 8;    stsd->tx3g.back_color[3] = a >> 8;    }  }  void lqt_get_text_fg_color(quicktime_t * file, int track,                           uint16_t * r, uint16_t * g,                           uint16_t * b, uint16_t * a)  {  quicktime_trak_t      * trak;  quicktime_stsd_table_t * stsd;  trak = file->ttracks[track].track;  stsd = &trak->mdia.minf.stbl.stsd.table[0];  if(quicktime_match_32(stsd->format, "text"))    {    *r = stsd->text.scrpColor[0];    *g = stsd->text.scrpColor[1];    *b = stsd->text.scrpColor[2];    *a = 0xffff;    }  else if(quicktime_match_32(stsd->format, "tx3g"))    {    *r = (stsd->tx3g.text_color[0] << 8) | stsd->tx3g.text_color[0];    *g = (stsd->tx3g.text_color[1] << 8) | stsd->tx3g.text_color[1];    *b = (stsd->tx3g.text_color[2] << 8) | stsd->tx3g.text_color[2];    *a = (stsd->tx3g.text_color[3] << 8) | stsd->tx3g.text_color[3];    }    }void lqt_get_text_bg_color(quicktime_t * file, int track,                           uint16_t * r, uint16_t * g,                           uint16_t * b, uint16_t * a)  {  quicktime_trak_t      * trak;  quicktime_stsd_table_t * stsd;  trak = file->ttracks[track].track;  stsd = &trak->mdia.minf.stbl.stsd.table[0];  if(quicktime_match_32(stsd->format, "text"))    {    *r = stsd->text.bgColor[0];    *g = stsd->text.bgColor[1];    *b = stsd->text.bgColor[2];    if(stsd->text.displayFlags & 0x4000)      *a = 0x0000;    else      *a = 0xFFFF;    }  else if(quicktime_match_32(stsd->format, "tx3g"))    {    *r = (stsd->tx3g.back_color[0] << 8) | stsd->tx3g.back_color[0];    *g = (stsd->tx3g.back_color[1] << 8) | stsd->tx3g.back_color[1];    *b = (stsd->tx3g.back_color[2] << 8) | stsd->tx3g.back_color[2];    *a = (stsd->tx3g.back_color[3] << 8) | stsd->tx3g.back_color[3];    }      }

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?