stsd.c

来自「这个库实现了录象功能」· C语言 代码 · 共 352 行

C
352
字号
/******************************************************************************* stsd.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 <stdlib.h>#include <string.h>#define LOG_DOMAIN "stsd"/* Tape name in timecode track */#define TCMI_NAME "Untitled"void quicktime_stsd_init(quicktime_stsd_t *stsd)  {  stsd->version = 0;  stsd->flags = 0;  stsd->total_entries = 0;  }void quicktime_stsd_init_table(quicktime_stsd_t *stsd)  {  if(!stsd->total_entries)    {    stsd->total_entries = 1;    stsd->table = (quicktime_stsd_table_t*)calloc(1, sizeof(quicktime_stsd_table_t) * stsd->total_entries);    quicktime_stsd_table_init(&(stsd->table[0]));    }  }int quicktime_stsd_init_qtvr(quicktime_t *file,                              quicktime_stsd_t *stsd,                             int track_type)  {  quicktime_stsd_table_t *table;  quicktime_stsd_init_table(stsd);  table = &(stsd->table[0]);  switch(track_type)	{	case QTVR_OBJ:	case QTVR_PAN:	  table->format[0] = '\0';	  table->format[1] = '\0';	  table->format[2] = '\0';	  table->format[3] = '\0';	  break;	case QTVR_QTVR_OBJ:	case QTVR_QTVR_PAN:	  table->format[0] = 'q';	  table->format[1] = 't';	  table->format[2] = 'v';	  table->format[3] = 'r';	  break;	default:	  lqt_log(file, LQT_LOG_ERROR, LOG_DOMAIN,			  "quicktime_stsd_init_qtvr invalid track type supplied.");	  return -1;	}  return 0;  }void quicktime_stsd_init_panorama(quicktime_t *file,                                   quicktime_stsd_t *stsd,                                  int width,                                  int height)  {  quicktime_stsd_table_t *table;  quicktime_stsd_init_table(stsd);	  table = &(stsd->table[0]);  table->format[0] = 'p';  table->format[1] = 'a';  table->format[2] = 'n';  table->format[3] = 'o';  table->pano.SWidth = width;  table->pano.SHeight = height;  }void quicktime_stsd_init_video(quicktime_t *file,                                quicktime_stsd_t *stsd,                                int frame_w,                               int frame_h,                                char * compression)  {  quicktime_stsd_table_t *table;  quicktime_stsd_init_table(stsd);  table = &(stsd->table[0]);  quicktime_copy_char32(table->format, compression);  table->width = frame_w;  table->height = frame_h;  table->frames_per_sample = 1;  table->depth = 24;  table->ctab_id = 65535;  }void quicktime_stsd_init_audio(quicktime_t *file,                                quicktime_stsd_t *stsd,                                int channels,                               int sample_rate,                                int bits,                                char *compressor)  {  quicktime_stsd_table_t *table;  quicktime_stsd_init_table(stsd);  table = &(stsd->table[0]);          quicktime_copy_char32(table->format, compressor);  quicktime_copy_char32(table->wave.frma.codec, compressor);  table->channels = channels;  table->sample_size = bits;  table->samplerate = sample_rate;  }void quicktime_stsd_init_text(quicktime_t *file,                               quicktime_stsd_t *stsd)  {  quicktime_stsd_table_t *table;  quicktime_stsd_text_t * text;    quicktime_stsd_init_table(stsd);  table = &(stsd->table[0]);  table->format[0] = 't';  table->format[1] = 'e';  table->format[2] = 'x';  table->format[3] = 't';    text = &table->text;  text->displayFlags = 0;  text->textJustification = 1;  text->bgColor[0] = 0;  text->bgColor[1] = 0;  text->bgColor[2] = 0;  text->defaultTextBox[0] = 0;  text->defaultTextBox[1] = 0;  text->defaultTextBox[2] = 0;  text->defaultTextBox[3] = 0;  text->scrpStartChar = 0;  text->scrpHeight =  16;  text->scrpFont   =   0;  text->scrpFace   =   0;  text->scrpSize   =  12;  text->scrpColor[0] = 65535;  text->scrpColor[1] = 65535;  text->scrpColor[2] = 65535;  strcpy(text->font_name, "Sans-Serif");  }void quicktime_stsd_init_tx3g(quicktime_t *file,                               quicktime_stsd_t *stsd)  {  quicktime_stsd_table_t *table;  quicktime_stsd_tx3g_t *tx3g;    quicktime_stsd_init_table(stsd);  table = &(stsd->table[0]);  table->format[0] = 't';  table->format[1] = 'x';  table->format[2] = '3';  table->format[3] = 'g';    tx3g = &table->tx3g;  tx3g->horizontal_justification = 1;  tx3g->vertical_justification   = 255;    tx3g->back_color[0] = 0;  tx3g->back_color[1] = 0;  tx3g->back_color[2] = 0;  tx3g->back_color[3] = 0;  tx3g->defaultTextBox[0] = 0;  tx3g->defaultTextBox[1] = 0;  tx3g->defaultTextBox[2] = 0;  tx3g->defaultTextBox[3] = 0;  tx3g->start_char_offset = 0;  tx3g->end_char_offset   = 0;  tx3g->font_id           = 1;  tx3g->style_flags       = 0;  tx3g->font_size         = 12;  tx3g->text_color[0]     = 255;  tx3g->text_color[1]     = 255;  tx3g->text_color[2]     = 255;  tx3g->text_color[3]     = 255;  quicktime_ftab_init(&tx3g->ftab, 1, "Sans-Serif");  tx3g->has_ftab = 1;  }void quicktime_stsd_init_timecode(quicktime_t *file,				  quicktime_stsd_t *stsd,				  int timescale,				  int frameduration,				  int numframes, uint32_t flags)  {  quicktime_stsd_table_t *table;  quicktime_stsd_init_table(stsd);  table = &stsd->table[0];    table->format[0] = 't';  table->format[1] = 'm';  table->format[2] = 'c';  table->format[3] = 'd';  table->tmcd.timescale     = timescale;  table->tmcd.frameduration = frameduration;  table->tmcd.numframes     = numframes;  table->tmcd.flags         = flags;    table->tmcd.name = strdup(TCMI_NAME);  }void quicktime_stsd_delete(quicktime_stsd_t *stsd)  {  int i;  if(stsd->total_entries)    {    for(i = 0; i < stsd->total_entries; i++)      quicktime_stsd_table_delete(&(stsd->table[i]));    free(stsd->table);    }  stsd->total_entries = 0;  }void quicktime_stsd_dump(void *minf_ptr, quicktime_stsd_t *stsd)  {  int i;  lqt_dump("     sample description (stsd)\n");  lqt_dump("      version %d\n", stsd->version);  lqt_dump("      flags %ld\n", stsd->flags);  lqt_dump("      total_entries %ld\n", stsd->total_entries);	  for(i = 0; i < stsd->total_entries; i++)    {    quicktime_stsd_table_dump(minf_ptr, &(stsd->table[i]));    }  }void quicktime_read_stsd(quicktime_t *file, quicktime_stsd_t *stsd)  {  int i;  stsd->version = quicktime_read_char(file);  stsd->flags = quicktime_read_int24(file);  stsd->total_entries = quicktime_read_int32(file);  stsd->table = calloc(stsd->total_entries, sizeof(quicktime_stsd_table_t));  for(i = 0; i < stsd->total_entries; i++)    {    quicktime_read_stsd_table_raw(file, &(stsd->table[i]));    }  }void quicktime_finalize_stsd(quicktime_t * file, quicktime_trak_t * trak,                             quicktime_stsd_t * stsd)  {  int64_t old_preload_size;  uint8_t *old_preload_buffer;  int64_t old_preload_start;  int64_t old_preload_end;  int64_t old_preload_ptr;  int64_t old_position;  int i;  /* Save old buffers from the file */  old_preload_size = file->preload_size;  old_preload_buffer = file->preload_buffer;  old_preload_start = file->preload_start;  old_preload_end = file->preload_end;  old_preload_ptr = file->preload_ptr;  old_position = quicktime_position(file);          for(i = 0; i < stsd->total_entries; i++)    {    quicktime_stsd_table_init(&(stsd->table[i]));                                    quicktime_set_position(file, 0);    file->preload_size = stsd->table[i].table_raw_size;    file->preload_buffer = stsd->table[i].table_raw;    file->preload_start = 0;    file->preload_end = file->preload_start + stsd->table[i].table_raw_size;    file->preload_ptr = 0;                    quicktime_read_stsd_table(file, &(trak->mdia.minf), &(stsd->table[i]));    if(trak->mdia.minf.is_video && !stsd->table[i].width && !stsd->table[i].height)      {      stsd->table[i].width =  (int)(trak->tkhd.track_width);      stsd->table[i].height = (int)(trak->tkhd.track_height);      }    }  file->preload_size = old_preload_size;  file->preload_buffer = old_preload_buffer;  file->preload_start = old_preload_start;  file->preload_end = old_preload_end;  file->preload_ptr = old_preload_ptr;  quicktime_set_position(file, old_position);  }void quicktime_write_stsd(quicktime_t *file,                          quicktime_minf_t *minf, quicktime_stsd_t *stsd)  {  quicktime_atom_t atom;  int i;  quicktime_atom_write_header(file, &atom, "stsd");  quicktime_write_char(file, stsd->version);  quicktime_write_int24(file, stsd->flags);  quicktime_write_int32(file, stsd->total_entries);  for(i = 0; i < stsd->total_entries; i++)    {    quicktime_write_stsd_table(file, minf, stsd->table);    }  quicktime_atom_write_footer(file, &atom);  }

⌨️ 快捷键说明

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