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