avi_info.c
来自「这个库实现了录象功能」· C语言 代码 · 共 242 行
C
242 行
/******************************************************************************* avi_info.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 "charset.h"#include <stdlib.h>#include <string.h>static char * my_strdup(const char * str) { char * ret = malloc(strlen(str)+1); strcpy(ret, str); return ret; }/* RS == read_string */#define RS(tag) \ if(!strncmp((char*)ptr, #tag, 4)) \ { \ info->tag = my_strdup((char*)(ptr + 8)); \ lqt_charset_convert(cnv, &(info->tag), -1, (int*)0); \ ptr += string_len + 8; \ if(string_len % 2) \ ptr++; \ continue; \ }void quicktime_read_riffinfo(quicktime_t *file, quicktime_riffinfo_t *info, quicktime_atom_t *parent_atom) { uint32_t string_len; uint8_t *buf, * ptr, *end_ptr; lqt_charset_converter_t * cnv; int size = parent_atom->end - quicktime_position(file); buf = malloc(size); ptr = buf; quicktime_read_data(file, ptr, size); end_ptr = ptr + size; cnv = lqt_charset_converter_create(file, "ISO-8859-1", "UTF-8"); while(ptr < end_ptr) { string_len = ((uint32_t)ptr[4]) | (((uint32_t)ptr[5]) << 8) | (((uint32_t)ptr[6]) << 16) | (((uint32_t)ptr[7]) << 24); RS(IARL); RS(IART); RS(ICMS); RS(ICMT); RS(ICOP); RS(ICRD); RS(ICRP); RS(IDIM); RS(IDPI); RS(IENG); RS(IGNR); RS(IKEY); RS(ILGT); RS(IMED); RS(INAM); RS(IPLT); RS(IPRD); RS(ISBJ); RS(ISFT); RS(ISHP); RS(ISRC); RS(ISRF); RS(ITCH); ptr += string_len + 8; if(string_len % 2) ptr++; } free(buf); lqt_charset_converter_destroy(cnv); }#undef RSvoid quicktime_init_riffinfo(quicktime_riffinfo_t *info) { info->ISFT = my_strdup(PACKAGE"-"VERSION); }/* WS == write_string */#define WS(tag) \ if(info->tag) \ { \ lqt_charset_convert(cnv, &(info->tag), -1, (int*)0); \ quicktime_atom_write_header(file, &child_atom, #tag);\ /* The trailing '\0' must be written to the file! */\ quicktime_write_data(file, (uint8_t*)info->tag, strlen(info->tag)+1); \ quicktime_atom_write_footer(file, &child_atom);\ }void quicktime_write_riffinfo(quicktime_t *file, quicktime_riffinfo_t *info) { quicktime_atom_t atom; quicktime_atom_t child_atom; lqt_charset_converter_t * cnv; cnv = lqt_charset_converter_create(file, "UTF-8", "ISO-8859-1"); quicktime_atom_write_header(file, &atom, "LIST"); quicktime_write_char32(file, "INFO"); WS(IARL); WS(IART); WS(ICMS); WS(ICMT); WS(ICOP); WS(ICRD); WS(ICRP); WS(IDIM); WS(IDPI); WS(IENG); WS(IGNR); WS(IKEY); WS(ILGT); WS(IMED); WS(INAM); WS(IPLT); WS(IPRD); WS(ISBJ); WS(ISFT); WS(ISHP); WS(ISRC); WS(ISRF); WS(ITCH); quicktime_atom_write_footer(file, &atom); lqt_charset_converter_destroy(cnv); }#define CP_STR_INFO_2_UDTA(src, dst, dst_len) \ if(info->src) \ { \ udta->dst = my_strdup(info->src); \ udta->dst_len = strlen(info->src); \ }void quicktime_riffinfo_2_udta(quicktime_riffinfo_t * info, quicktime_udta_t * udta) { /* Artist */ CP_STR_INFO_2_UDTA(IART, artist, artist_len); /* Name */ CP_STR_INFO_2_UDTA(INAM, name, name_len); /* Comment */ CP_STR_INFO_2_UDTA(ICMT, comment, comment_len); /* Copyright */ CP_STR_INFO_2_UDTA(ICOP, copyright, copyright_len); /* genre */ CP_STR_INFO_2_UDTA(IGNR, genre, genre_len); }#undef CP_STR_INFO_2_UDTA#define CP_STR_UDTA_2_INFO(dst, src) \ if(udta->src) \ { \ info->dst = my_strdup(udta->src); \ }void quicktime_udta_2_riffinfo(quicktime_udta_t * udta, quicktime_riffinfo_t * info) { /* Artist */ CP_STR_UDTA_2_INFO(IART, artist); /* Name */ CP_STR_UDTA_2_INFO(INAM, name); /* Comment */ CP_STR_UDTA_2_INFO(ICMT, comment); /* Copyright */ CP_STR_UDTA_2_INFO(ICOP, copyright); /* genre */ CP_STR_UDTA_2_INFO(IGNR, genre); }/* FS = free_string */#define FS(tag) if(info->tag) { free(info->tag); info->tag = (char*)0; }void quicktime_delete_riffinfo(quicktime_riffinfo_t * info) { FS(IARL); FS(IART); FS(ICMS); FS(ICMT); FS(ICOP); FS(ICRD); FS(ICRP); FS(IDIM); FS(IDPI); FS(IENG); FS(IGNR); FS(IKEY); FS(ILGT); FS(IMED); FS(INAM); FS(IPLT); FS(IPRD); FS(ISBJ); FS(ISFT); FS(ISHP); FS(ISRC); FS(ISRF); FS(ITCH); }
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?