⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 in_mp4.c

📁 mpeg4 video codec mpeg4 video codec
💻 C
字号:
/*** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com**  ** This program is free software; you can redistribute it and/or modify** it under the terms of the GNU General Public License as published by** the Free Software Foundation; either version 2 of the License, or** (at your option) any later version.** ** This program 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 General Public License for more details.** ** You should have received a copy of the GNU General Public License** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.**** Any non-GPL usage of this software or parts of this software is strictly** forbidden.**** Commercial non-GPL licensing of this software is possible.** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.**** $Id: in_mp4.c,v 1.1 2006/02/23 14:38:13 kevin-fu Exp $**///#define DEBUG_OUTPUT#define WIN32_LEAN_AND_MEAN#include <windows.h>#include <commctrl.h>#include <commdlg.h>#include <stdlib.h>#include <math.h>#include <faad.h>#include <mp4.h>#include "resource.h"#include "in2.h"#include "utils.h"#include "config.h"#include "aacinfo.h"#include "aac2mp4.h"const char *long_ext_list = "MP4\0MPEG-4 Files (*.MP4)\0M4A\0MPEG-4 Files (*.M4A)\0AAC\0AAC Files (*.AAC)\0";const char *short_ext_list = "MP4\0MPEG-4 Files (*.MP4)\0M4A\0MPEG-4 Files (*.M4A)\0";static long priority_table[] = {    0,    THREAD_PRIORITY_HIGHEST,    THREAD_PRIORITY_ABOVE_NORMAL,    THREAD_PRIORITY_NORMAL,    THREAD_PRIORITY_BELOW_NORMAL,    THREAD_PRIORITY_LOWEST};static int res_id_table[] = {    IDC_16BITS,    IDC_24BITS,    IDC_32BITS,    0,    0,    /*IDC_16BITS_DITHERED*/ IDC_16BITS /* temp hack */};static int res_table[] = {    16,    24,    32,    0,    0,    16};static char info_fn[_MAX_PATH];// post this to the main window at end of file (after playback has stopped)#define WM_WA_AAC_EOF WM_USER+2struct seek_list{    struct seek_list *next;    __int64 offset;};typedef struct state{    /* general stuff */    faacDecHandle hDecoder;    int samplerate;    unsigned char channels;    double decode_pos_ms; // current decoding position, in milliseconds    int paused; // are we paused?    int seek_needed; // if != -1, it is the point that the decode thread should seek to, in ms.    char filename[_MAX_PATH];    int filetype; /* 0: MP4; 1: AAC */    int last_frame;    __int64 last_offset;    /* MP4 stuff */    MP4FileHandle mp4file;    int mp4track;    MP4SampleId numSamples;    MP4SampleId sampleId;    /* AAC stuff */    FILE *aacfile;    long m_aac_bytes_into_buffer;    long m_aac_bytes_consumed;    __int64 m_file_offset;    unsigned char *m_aac_buffer;    int m_at_eof;    double cur_pos_sec;    int m_header_type;    struct seek_list *m_head;    struct seek_list *m_tail;    unsigned long m_length;    /* for gapless decoding */    unsigned int useAacLength;    unsigned int framesize;    unsigned int initial;    unsigned long timescale;} state;static state mp4state;static In_Module module; // the output module (declared near the bottom of this file)static int killPlayThread;static int PlayThreadAlive = 0; // 1=play thread still runningHANDLE play_thread_handle = INVALID_HANDLE_VALUE; // the handle to the decode thread/* Function definitions */void *decode_aac_frame(state *st, faacDecFrameInfo *frameInfo);DWORD WINAPI MP4PlayThread(void *b); // the decode thread procedureDWORD WINAPI AACPlayThread(void *b); // the decode thread proceduretypedef struct tag{    char *item;    char *value;    size_t len;} tag;typedef struct medialib_tags{    struct tag *tags;    unsigned int count;} medialib_tags;int tag_add_field(medialib_tags *tags, const char *item, const char *value, size_t v_len){    void *backup = (void *)tags->tags;    if (!item || (item && !*item) || !value) return 0;    tags->tags = (struct tag *)realloc(tags->tags, (tags->count+1) * sizeof(tag));    if (!tags->tags) {        if (backup) free(backup);        return 0;    }    else    {        size_t i_len = strlen(item);        if (v_len == 0) v_len = strlen(value);        tags->tags[tags->count].item = (char *)malloc(i_len+1);        tags->tags[tags->count].value = (char *)malloc(v_len+1);        if (!tags->tags[tags->count].item || !tags->tags[tags->count].value)        {            if (!tags->tags[tags->count].item) free (tags->tags[tags->count].item);            if (!tags->tags[tags->count].value) free (tags->tags[tags->count].value);            tags->tags[tags->count].item = NULL;            tags->tags[tags->count].value = NULL;            return 0;        }        memcpy(tags->tags[tags->count].item, item, i_len);        memcpy(tags->tags[tags->count].value, value, v_len);        tags->tags[tags->count].item[i_len] = '\0';        tags->tags[tags->count].value[v_len] = '\0';        tags->tags[tags->count].len = v_len;        tags->count++;        return 1;    }}int tag_set_field(medialib_tags *tags, const char *item, const char *value, size_t v_len){    unsigned int i;    if (!item || (item && !*item) || !value) return 0;    for (i = 0; i < tags->count; i++)    {        if (!stricmp(tags->tags[i].item, item))        {            void *backup = (void *)tags->tags[i].value;            if (v_len == 0) v_len = strlen(value);            tags->tags[i].value = (char *)realloc(tags->tags[i].value, v_len+1);            if (!tags->tags[i].value)            {                if (backup) free(backup);                return 0;            }            memcpy(tags->tags[i].value, value, v_len);            tags->tags[i].value[v_len] = '\0';            tags->tags[i].len = v_len;            return 1;        }    }    return tag_add_field(tags, item, value, v_len);}int tag_delete(medialib_tags *tags){    unsigned int i;    for (i = 0; i < tags->count; i++)    {        if (tags->tags[i].item) free(tags->tags[i].item);        if (tags->tags[i].value) free(tags->tags[i].value);    }    if (tags->tags) free(tags->tags);    tags->tags = NULL;    tags->count = 0;}int ReadMP4Tag(MP4FileHandle file, medialib_tags *tags){    unsigned __int32 valueSize;    unsigned __int8 *pValue;    char *pName;    unsigned int i = 0;    do {        pName = 0;        pValue = 0;        valueSize = 0;        MP4GetMetadataByIndex(file, i, (const char **)&pName, &pValue, &valueSize);        if (valueSize > 0)        {            char *val = (char *)malloc(valueSize+1);            if (!val) return 0;            memcpy(val, pValue, valueSize);            val[valueSize] = '\0';            if (pName[0] == '

⌨️ 快捷键说明

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