亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? avienc.c

?? 杜比AC-3編碼解碼器(參考程序)
?? C
字號:
/*
 * AVI encoder.
 * Copyright (c) 2000 Gerard Lantau.
 *
 * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
 */
#include <stdlib.h>
#include <stdio.h>
#include <netinet/in.h>
#include <string.h>
#include "mpegenc.h"

typedef long long offset_t;

typedef struct AVIIndex {
    unsigned char tag[4];
    unsigned int flags, pos, len;
    struct AVIIndex *next;
} AVIIndex;

typedef struct {
    offset_t movi_list;
    AVIIndex *first, *last;
} AVIContext;

static offset_t start_tag(PutByteContext *pb, char *tag)
{
    put_tag(pb, tag);
    put_le32(pb, 0);
    return put_pos(pb);
}

static void end_tag(PutByteContext *pb, offset_t start)
{
    offset_t pos;

    pos = put_pos(pb);
    put_seek(pb, start - 4, SEEK_SET);
    put_le32(pb, pos - start);
    put_seek(pb, pos, SEEK_SET);
}


#define AVIF_HASINDEX		0x00000010	// Index at end of file?
#define AVIF_MUSTUSEINDEX	0x00000020
#define AVIF_ISINTERLEAVED	0x00000100
#define AVIF_TRUSTCKTYPE	0x00000800	// Use CKType to find key frames?
#define AVIF_WASCAPTUREFILE	0x00010000
#define AVIF_COPYRIGHTED	0x00020000

#define MKTAG(a,b,c,d) (a | (b << 8) | (c << 16) | (d << 24))

unsigned int codec_get_bmp_tag(int id)
{
    switch(id) {
    case CODEC_ID_H263:
        return MKTAG('I', '2', '6', '3'); 
    case CODEC_ID_MJPEG:
        return MKTAG('M', 'J', 'P', 'G'); 
    case CODEC_ID_DIVX:
        return MKTAG('d', 'i', 'v', 'x'); 
    default:
        abort();
    }
}

/* BITMAPINFOHEADER header */
void put_bmp_header(PutByteContext *pb, AVEncodeContext *enc)
{
    put_le32(pb, 40); /* size */
    put_le32(pb, enc->width);
    put_le32(pb, enc->height);
    put_le16(pb, 1); /* planes */
    put_le16(pb, 24); /* depth */
    /* compression type */
    put_le32(pb, codec_get_bmp_tag(enc->codec->id));
    put_le32(pb, enc->width * enc->height * 3);
    put_le32(pb, 0);
    put_le32(pb, 0);
    put_le32(pb, 0);
    put_le32(pb, 0);
}

/* WAVEFORMATEX header */
void put_wav_header(PutByteContext *pb, AVEncodeContext *enc)
{
    int id;

    switch(enc->codec->id) {
    case CODEC_ID_MP2:
        id = 0x55; /* MP3 format */
        break;
    default:
        abort();
    }
    put_le16(pb, id); 
    put_le16(pb, enc->channels);
    put_le32(pb, enc->rate);
    put_le32(pb, enc->bit_rate / 8);
    put_le16(pb, 1); /* block align */
    put_le16(pb, 16); /* bits per sample */
    put_le16(pb, 0); /* wav_extra_size */
}

static int avi_write_header(AVFormatContext *s)
{
    AVIContext *avi;
    PutByteContext *pb = &s->pb;
    int bitrate, n, i;
    AVEncodeContext *stream;
    offset_t list1, list2, strh, strf;

    avi = malloc(sizeof(AVIContext));
    if (!avi)
        return -1;
    memset(avi, 0, sizeof(AVIContext));
    s->priv_data = avi;

    put_tag(pb, "RIFF");
    put_le32(pb, 0); /* file length */
    put_tag(pb, "AVI ");

    /* header list */
    list1 = start_tag(pb, "LIST");
    put_tag(pb, "hdrl");

    /* avi header */
    put_tag(pb, "avih");
    put_le32(pb, 14 * 4);
    bitrate = 0;
    n = 0;
    if (s->audio_enc) {
        bitrate += s->audio_enc->bit_rate;
        n++;
    }
    if (s->video_enc) {
        bitrate += s->video_enc->bit_rate;
        n++;
    }

    put_le32(pb, 1000000 / s->video_enc->rate);
    put_le32(pb, bitrate / 8); /* XXX: not quite exact */
    put_le32(pb, 0); /* padding */
    put_le32(pb, AVIF_ISINTERLEAVED); /* flags */
    put_le32(pb, 0); /* nb frames, filled later */
    put_le32(pb, 0); /* initial frame */
    put_le32(pb, n); /* nb streams */
    put_le32(pb, 0); /* suggested buffer size */
    put_le32(pb, s->video_enc->width);
    put_le32(pb, s->video_enc->height);
    put_le32(pb, 0); /* reserved */
    put_le32(pb, 0); /* reserved */
    put_le32(pb, 0); /* reserved */
    put_le32(pb, 0); /* reserved */
    
    /* stream list */
    for(i=0;i<n;i++) {
        list2 = start_tag(pb, "LIST");
        put_tag(pb, "strl");
    
        if (i == 0)
            stream = s->video_enc;
        else
            stream = s->audio_enc;

        /* stream generic header */
        strh = start_tag(pb, "strh");
        switch(stream->codec->type) {
        case CODEC_TYPE_VIDEO:
            put_tag(pb, "vids");
            put_le32(pb, codec_get_bmp_tag(stream->codec->id));
            put_le32(pb, 0); /* flags */
            put_le16(pb, 0); /* priority */
            put_le16(pb, 0); /* language */
            put_le32(pb, 0); /* XXX: initial frame ? */
            put_le32(pb, 1000); /* scale */
            put_le32(pb, 1000 * stream->rate); /* rate */
            put_le32(pb, 0); /* start */
            put_le32(pb, 0); /* length, filled later */
            put_le32(pb, 0); /* suggested buffer size */
            put_le32(pb, 10000); /* quality */
            put_le32(pb, stream->width * stream->height * 3); /* sample size */
            break;
        case CODEC_TYPE_AUDIO:
            put_tag(pb, "auds");
            put_le32(pb, 0);
            put_le32(pb, 0); /* flags */
            put_le16(pb, 0); /* priority */
            put_le16(pb, 0); /* language */
            put_le32(pb, 1); /* XXX: initial frame ? */
            put_le32(pb, 1); /* scale */
            put_le32(pb, stream->bit_rate / 8); /* rate */
            put_le32(pb, 0); /* start */
            put_le32(pb, 0); /* length, filled later */
            put_le32(pb, 0); /* suggested buffer size */
            put_le32(pb, -1); /* quality */
            put_le32(pb, 1); /* sample size */
            break;
        }
        put_le32(pb, 0);
        put_le32(pb, 0);
        end_tag(pb, strh);

        strf = start_tag(pb, "strf");
        switch(stream->codec->type) {
        case CODEC_TYPE_VIDEO:
            put_bmp_header(pb, stream);
            break;
        case CODEC_TYPE_AUDIO:
            put_wav_header(pb, stream);
            break;
        }
        end_tag(pb, strf);
        end_tag(pb, list2);
    }

    end_tag(pb, list1);

    avi->movi_list = start_tag(pb, "LIST");
    avi->first = NULL;
    avi->last = NULL;
    put_tag(pb, "movi");

    put_flush_packet(pb);

    return 0;
}

static void new_index(AVFormatContext *s, AVEncodeContext *enc,
                      UINT8 *buf, unsigned int size)
{
    AVIContext *avi = s->priv_data;
    PutByteContext *pb = &s->pb;
    AVIIndex *idx;
    unsigned char tag[5];
    unsigned int flags;

    tag[0] = '0';
    if (enc->codec->type == CODEC_TYPE_VIDEO) {
        tag[1] = '0';
        tag[2] = 'd';
        tag[3] = 'c';
        flags = enc->key_frame ? 0x10 : 0x00;
    } else {
        tag[1] = '1';
        tag[2] = 'w';
        tag[3] = 'b';
        flags = 0;
    }

    if (!s->is_streamed) {
        idx = malloc(sizeof(AVIIndex));
        memcpy(idx->tag, tag, 4);
        idx->flags = flags;
        idx->pos = put_pos(pb) - avi->movi_list;
        idx->len = size;
        idx->next = NULL;
        if (!avi->last)
            avi->first = idx;
        else
            avi->last->next = idx;
        avi->last = idx;
    }
    
    put_buffer(pb, tag, 4);
    put_le32(pb, size);
    put_buffer(pb, buf, size);
    if (size & 1)
        put_byte(pb, 0);

    put_flush_packet(pb);
}

static int avi_write_audio(AVFormatContext *s, UINT8 *buf, int size)
{
    new_index(s, s->audio_enc, buf, size);
    return 0;
}

static int avi_write_video(AVFormatContext *s, UINT8 *buf, int size)
{
    new_index(s, s->video_enc, buf, size);
    return 0;
}

static int avi_write_trailer(AVFormatContext *s)
{
    PutByteContext *pb = &s->pb;
    AVIContext *avi = s->priv_data;
    offset_t file_size, idx_chunk;
    AVIIndex *idx;

    if (!s->is_streamed) {
        end_tag(pb, avi->movi_list);

        idx_chunk = start_tag(pb, "idx1");
        idx = avi->first;
        while (idx != NULL) {
            put_buffer(pb, idx->tag, 4);
            put_le32(pb, idx->flags);
            put_le32(pb, idx->pos);
            put_le32(pb, idx->len);
            idx = idx->next;
        }
        end_tag(pb, idx_chunk);
        
        /* update file size */
        file_size = put_pos(pb);
        put_seek(pb, 4, SEEK_SET);
        put_le32(pb, file_size);
        put_seek(pb, file_size, SEEK_SET);
    }
    put_flush_packet(pb);

    free(avi);
    return 0;
}

AVFormat avi_format = {
    "avi",
    "avi format",
    "",
    "avi",
    CODEC_ID_MP2,
    CODEC_ID_DIVX,
    avi_write_header,
    avi_write_audio,
    avi_write_video,
    avi_write_trailer,
};

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
暴力调教一区二区三区| 91黄色激情网站| 欧美在线短视频| 一区二区三区不卡在线观看| 精品一区二区三区不卡| 欧美在线啊v一区| 国产精品福利一区| 国产一区二区电影| 日韩欧美黄色影院| 舔着乳尖日韩一区| 色国产精品一区在线观看| 国产精品日韩成人| 国产乱淫av一区二区三区 | 欧美日韩国产首页| 亚洲视频电影在线| 国产成人99久久亚洲综合精品| 欧美裸体一区二区三区| 一区二区日韩av| 97久久精品人人做人人爽50路| 国产亚洲视频系列| 国内久久精品视频| 欧美日韩aaaaa| 亚洲va欧美va国产va天堂影院| 白白色亚洲国产精品| 国产欧美日韩另类视频免费观看| 国产美女久久久久| 久久久精品综合| 国产在线播精品第三| 精品裸体舞一区二区三区| 久久精品国产**网站演员| 678五月天丁香亚洲综合网| 午夜日韩在线电影| 在线综合亚洲欧美在线视频| 美女视频黄a大片欧美| 日韩免费视频一区二区| 毛片一区二区三区| 欧美精品一区二区三| 国产一区二区导航在线播放| 国产性天天综合网| av不卡一区二区三区| 一区二区三区久久| 欧美一区午夜视频在线观看| 美女视频网站久久| 久久久久久97三级| www.av精品| 亚洲午夜一区二区三区| 欧美一区二区三区视频免费播放| 麻豆国产精品777777在线| 久久蜜桃一区二区| www.久久精品| 日韩影院在线观看| 久久免费午夜影院| 在线视频综合导航| 麻豆精品蜜桃视频网站| 中文字幕不卡的av| 欧美三级一区二区| 国产一区二区日韩精品| 国产精品国产三级国产a| 欧美少妇一区二区| 国内精品伊人久久久久av一坑| 国产精品色婷婷久久58| 欧美精品丝袜中出| 国产成人夜色高潮福利影视| 亚洲欧美激情一区二区| 日韩午夜在线观看视频| av电影在线观看完整版一区二区| 一区二区三区国产精华| 精品国产凹凸成av人网站| 成人网页在线观看| 丝袜亚洲精品中文字幕一区| 国产亚洲视频系列| 在线观看91av| 91女人视频在线观看| 久久99深爱久久99精品| 亚洲伦理在线精品| 欧美精品一区在线观看| 欧美私人免费视频| 成人激情动漫在线观看| 青娱乐精品在线视频| 亚洲欧美日韩国产一区二区三区 | 综合av第一页| 欧美一卡二卡三卡四卡| 972aa.com艺术欧美| 韩日av一区二区| 五月天精品一区二区三区| 亚洲图片欧美激情| 久久天堂av综合合色蜜桃网| 欧美二区在线观看| 欧美视频一区在线观看| 99久久精品免费精品国产| 精品一区二区三区不卡| 青椒成人免费视频| 亚洲成人综合网站| 亚洲精品久久7777| 国产精品久久久久影院| 亚洲精品在线电影| 欧美一区二区免费观在线| 欧美午夜精品电影| 99久久精品免费看国产| 不卡电影一区二区三区| 国产成人精品亚洲午夜麻豆| 极品少妇一区二区三区精品视频| 亚洲成人免费看| 亚洲成人一区在线| 亚洲综合成人在线视频| 亚洲人成精品久久久久久| 国产精品嫩草99a| 国产女人18水真多18精品一级做| 精品日韩在线一区| 欧美成人a视频| 久久一区二区三区国产精品| 精品欧美一区二区在线观看 | 中文字幕亚洲不卡| 中文字幕不卡三区| 亚洲天堂免费在线观看视频| 亚洲天天做日日做天天谢日日欢| 亚洲欧洲性图库| 亚洲黄色免费电影| 亚洲一区二区三区四区五区中文| 亚洲一区视频在线| 性欧美大战久久久久久久久| 日韩国产在线一| 久久99久久久欧美国产| 国产真实乱子伦精品视频| 精品在线播放免费| 成人午夜av电影| 在线观看成人小视频| 欧美日韩国产中文| 欧美变态口味重另类| 国产日韩欧美不卡| 亚洲一区二区欧美| 爽好久久久欧美精品| 久久成人羞羞网站| proumb性欧美在线观看| 在线看日本不卡| 日韩欧美久久一区| 欧美国产1区2区| 亚洲成人综合在线| 国产精品一区二区免费不卡| 96av麻豆蜜桃一区二区| 在线不卡一区二区| 日本一区二区三区免费乱视频| 亚洲欧洲综合另类| 免费在线视频一区| 成人国产亚洲欧美成人综合网| 欧美日韩亚洲综合在线 | 国产麻豆视频一区二区| 99亚偷拍自图区亚洲| 6080亚洲精品一区二区| 中文一区一区三区高中清不卡| 亚洲精品国产精华液| 麻豆一区二区三区| 99re成人精品视频| 精品国产一区二区三区久久影院 | 日本二三区不卡| 欧美成人女星排名| 亚洲永久精品国产| 高清国产一区二区三区| 欧美日本视频在线| 一区在线观看免费| 精品亚洲成av人在线观看| 日本韩国一区二区三区视频| 26uuu亚洲综合色| 天天色天天操综合| 91蝌蚪国产九色| 久久免费午夜影院| 日本在线不卡视频| 色爱区综合激月婷婷| 久久综合色播五月| 五月天一区二区| 91黄色免费版| 亚洲婷婷综合色高清在线| 九九精品一区二区| 欧美精品少妇一区二区三区| 亚洲免费观看高清在线观看| 国产精品原创巨作av| 91麻豆精品久久久久蜜臀| 一区二区成人在线观看| www.一区二区| 中文一区在线播放| 国产sm精品调教视频网站| 精品免费99久久| 麻豆精品在线视频| 欧美一区二区三区视频在线观看| 亚洲一区二区三区精品在线| 91丨porny丨户外露出| 国产日本亚洲高清| 国产麻豆一精品一av一免费| 精品成a人在线观看| 另类成人小视频在线| 欧美精品xxxxbbbb| 午夜国产不卡在线观看视频| 色综合激情五月| 亚洲精品乱码久久久久久久久| 一本久道中文字幕精品亚洲嫩| 亚洲视频你懂的| 在线免费不卡视频| 亚洲成a人v欧美综合天堂下载| 欧美日韩中文字幕精品| 亚洲一区二区在线免费看|