ftyp.c
来自「这个库实现了录象功能」· C语言 代码 · 共 199 行
C
199 行
/******************************************************************************* ftyp.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 MK_FOURCC(a, b, c, d) \ (((uint32_t)a << 24) | \ ((uint32_t)b << 16) | \ ((uint32_t)c << 8) | \ ((uint32_t)d))#if 0 uint32_t major_brand; uint32_t minor_version; int num_compatible_brands; uint32_t * compatible_brands;#endifstatic quicktime_ftyp_t ftyp_qt = { .major_brand = MK_FOURCC('q','t',' ',' '), .minor_version = 0x20050300, .num_compatible_brands = 4, .compatible_brands = (uint32_t[]){ MK_FOURCC('q','t',' ',' '),0,0,0 }, };static quicktime_ftyp_t ftyp_mp4 = { .major_brand = MK_FOURCC('m','p','4','2'), .minor_version = 0x0, .num_compatible_brands = 2, .compatible_brands = (uint32_t[]){MK_FOURCC('m','p','4','2'), MK_FOURCC('i','s','o','m')}, };static quicktime_ftyp_t ftyp_3gp = { .major_brand = MK_FOURCC('3','g','p','5'), .minor_version = 0x00000200, .num_compatible_brands = 5, .compatible_brands = (uint32_t[]){MK_FOURCC('i','s','o','m'), MK_FOURCC('3','g','p','5'), MK_FOURCC('3','g','p','4'), MK_FOURCC('m','p','4','1'), MK_FOURCC('m','p','4','2')}, };static quicktime_ftyp_t ftyp_m4a = { .major_brand = MK_FOURCC('M','4','A',' '), .minor_version = 0x0, .num_compatible_brands = 4, .compatible_brands = (uint32_t[]){MK_FOURCC('M','4','A',' '), MK_FOURCC('m','p','4','2'), MK_FOURCC('i','s','o','m'), 0}, };static void copy_ftyp(quicktime_ftyp_t * dst, quicktime_ftyp_t * src) { dst->major_brand = src->major_brand; dst->minor_version = src->minor_version; dst->num_compatible_brands = src->num_compatible_brands; dst->compatible_brands = malloc(dst->num_compatible_brands * sizeof(*dst->compatible_brands)); memcpy(dst->compatible_brands, src->compatible_brands, dst->num_compatible_brands * sizeof(*dst->compatible_brands)); }void quicktime_ftyp_init(quicktime_ftyp_t * ftyp, lqt_file_type_t type) { memset(ftyp, 0, sizeof(*ftyp)); switch(type) { case LQT_FILE_NONE: case LQT_FILE_QT_OLD: case LQT_FILE_AVI: case LQT_FILE_AVI_ODML: return; case LQT_FILE_QT: copy_ftyp(ftyp, &ftyp_qt); return; case LQT_FILE_MP4: copy_ftyp(ftyp, &ftyp_mp4); return; case LQT_FILE_M4A: copy_ftyp(ftyp, &ftyp_m4a); return; case LQT_FILE_3GP: copy_ftyp(ftyp, &ftyp_3gp); return; } }lqt_file_type_t quicktime_ftyp_get_file_type(quicktime_ftyp_t * ftyp) { switch(ftyp->major_brand) { case MK_FOURCC('i','s','o','m'): case MK_FOURCC('m','p','4','1'): case MK_FOURCC('m','p','4','2'): return LQT_FILE_MP4; break; case MK_FOURCC('M','4','A',' '): return LQT_FILE_M4A; break; case MK_FOURCC('q','t',' ',' '): return LQT_FILE_QT; break; case MK_FOURCC('3','g','p','4'): case MK_FOURCC('3','g','p','5'): return LQT_FILE_3GP; } return 0; }void quicktime_read_ftyp(quicktime_t *file, quicktime_ftyp_t *ftyp, quicktime_atom_t *parent_atom) { int i; ftyp->major_brand = quicktime_read_int32(file); ftyp->minor_version = quicktime_read_int32(file); ftyp->num_compatible_brands = (parent_atom->end - quicktime_position(file)) / 4; ftyp->compatible_brands = malloc(ftyp->num_compatible_brands * sizeof(ftyp->compatible_brands)); for(i = 0; i < ftyp->num_compatible_brands; i++) { ftyp->compatible_brands[i] = quicktime_read_int32(file); } }void quicktime_write_ftyp(quicktime_t *file, quicktime_ftyp_t *ftyp) { int i; quicktime_atom_t atom; quicktime_atom_write_header(file, &atom, "ftyp"); quicktime_write_int32(file, ftyp->major_brand); quicktime_write_int32(file, ftyp->minor_version); for(i = 0; i < ftyp->num_compatible_brands; i++) quicktime_write_int32(file, ftyp->compatible_brands[i]); quicktime_atom_write_footer(file, &atom); }static void dump_fourcc(uint32_t f) { lqt_dump("%c%c%c%c", (f >> 24) & 0xff, (f >> 16) & 0xff, (f >> 8) & 0xff, f & 0xff); }void quicktime_ftyp_dump(quicktime_ftyp_t *ftyp) { int i; lqt_dump("ftyp\n"); lqt_dump(" major brand: "); dump_fourcc(ftyp->major_brand); lqt_dump("\n minor version: %08x\n", ftyp->minor_version); lqt_dump(" compatible brands: "); for(i = 0; i < ftyp->num_compatible_brands; i++) { dump_fourcc(ftyp->compatible_brands[i]); lqt_dump(" "); } lqt_dump("\n"); }void quicktime_ftyp_delete(quicktime_ftyp_t *ftyp) { if(ftyp->compatible_brands) free(ftyp->compatible_brands); }
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?