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

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

?? ffmpeg.c

?? tcpmpflvplugin-v0.4-src TCPMP flash video的插件源碼
?? C
字號:
/*****************************************************************************
 *
 * 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
 *
 * $Id: ffmpeg.c 603 2006-01-19 13:00:33Z picard $
 *
 * The Core Pocket Media Player
 * Copyright (c) 2004-2005 Gabor Kovacs
 *
 ****************************************************************************/

#include "../common/common.h"
#include "ffmpeg.h"

#undef malloc
#undef realloc
#undef free
#include "libavcodec/avcodec.h"

typedef struct ffmpeg_video
{
	codec Codec;
	buffer Buffer;
    AVCodecContext *Context;
    AVFrame *Picture;
	AVRational Aspect;
	int PixelFormat;
	int SkipToKey;
	int DropToKey;
	bool_t Dropping;
	int CodecId;
	tick_t FrameTime;
    AVPaletteControl Palette;

} ffmpeg_video;

typedef struct codecinfo
{
	int Id;
	int CodecId;
	const tchar_t* Name;
	const tchar_t* ContentType;
	
} codecinfo;

#define FFMPEG_VIDEO_CLASS		FOURCC('F','F','M','V')

static const codecinfo Info[] = 
{
	{FOURCC('F','L','V','1'),CODEC_ID_FLV1,T("FFmpeg FLV1"),
		T("vcodec/flv1")},

	{0},
};

static bool_t BuildOutputFormat(ffmpeg_video* p)
{
	int pix_fmt = p->Context->pix_fmt;
	if (pix_fmt<0)
		pix_fmt = PIX_FMT_YUV420P; // is this needed?

	PacketFormatClear(&p->Codec.Out.Format);
	p->Codec.Out.Format.Type = PACKET_VIDEO;

	switch (pix_fmt)
	{
	case PIX_FMT_YUV410P:
		p->Codec.Out.Format.Format.Video.Pixel.Flags = PF_YUV410;
		break;
	case PIX_FMT_YUV420P:
		p->Codec.Out.Format.Format.Video.Pixel.Flags = PF_YUV420;
		break;
	case PIX_FMT_BGR24:
		DefaultRGB(&p->Codec.Out.Format.Format.Video.Pixel,24,8,8,8,0,0,0);
		break;
	case PIX_FMT_RGBA32:
		DefaultRGB(&p->Codec.Out.Format.Format.Video.Pixel,32,8,8,8,0,0,0);
		break;
	case PIX_FMT_RGB555:
		DefaultRGB(&p->Codec.Out.Format.Format.Video.Pixel,16,5,5,5,0,0,0);
		break;
	case PIX_FMT_PAL8:
		p->Codec.Out.Format.Format.Video.Pixel.Flags = PF_PALETTE;
		p->Codec.Out.Format.Format.Video.Pixel.BitCount = 8;
		p->Codec.Out.Format.Format.Video.Pixel.Palette = p->Codec.In.Format.Format.Video.Pixel.Palette;
		break;
	default:
		return 0;
	}

	p->Aspect = p->Context->sample_aspect_ratio;
	p->Codec.Out.Format.Format.Video.Aspect = p->Codec.In.Format.Format.Video.Aspect;
	if (p->Context->sample_aspect_ratio.num>0 && !p->Codec.Out.Format.Format.Video.Aspect)
		p->Codec.Out.Format.Format.Video.Aspect = Scale(ASPECT_ONE,p->Context->sample_aspect_ratio.num,p->Context->sample_aspect_ratio.den);

	p->Codec.In.Format.Format.Video.Width = p->Codec.Out.Format.Format.Video.Width = p->Context->width;
	p->Codec.In.Format.Format.Video.Height = p->Codec.Out.Format.Format.Video.Height = p->Context->height;
	
	if (p->Picture->linesize[0])
		p->Codec.Out.Format.Format.Video.Pitch = p->Picture->linesize[0];
	else
		DefaultPitch(&p->Codec.Out.Format.Format.Video);

	p->PixelFormat = p->Context->pix_fmt;

	if (p->Context->bit_rate > 0 && p->Context->bit_rate < 100000000)
		p->Codec.In.Format.ByteRate = p->Context->bit_rate/8;
	if (p->Context->time_base.num > 0)
	{
		p->Codec.In.Format.PacketRate.Num = p->Context->time_base.den;
		p->Codec.In.Format.PacketRate.Den = p->Context->time_base.num;
		p->FrameTime = Scale(TICKSPERSEC,p->Codec.In.Format.PacketRate.Den,p->Codec.In.Format.PacketRate.Num);
	}
	else
		p->FrameTime = TIME_UNKNOWN;

	//ShowMessage("","%d %d %d",p->Context->pix_fmt,p->Context->width,p->Context->height);
	return 1;
}

static void UpdateSettings(ffmpeg_video* p)
{
	p->Context->skip_loop_filter = QueryAdvanced(ADVANCED_NODEBLOCKING)? AVDISCARD_ALL : AVDISCARD_DEFAULT;
}

static int UpdateInput( ffmpeg_video* p )
{
	if (p->Context)
		avcodec_close(p->Context);
    av_free(p->Context);
    av_free(p->Picture);
	p->Context = NULL;
	p->Picture = NULL;
	BufferClear(&p->Buffer);

	if (p->Codec.In.Format.Type == PACKET_VIDEO)
	{
	    AVCodec *Codec;

		const codecinfo *i;
		for (i=Info;i->Id;++i)
			if (i->Id == p->Codec.Node.Class)
				break;
		if (!i->Id)
			return ERR_INVALID_DATA;
		
		Codec = avcodec_find_decoder(i->CodecId);
		if (!Codec)
			return ERR_INVALID_DATA;

		p->Context = avcodec_alloc_context();
		p->Picture = avcodec_alloc_frame();

		if (!p->Context || !p->Picture)
			return ERR_OUT_OF_MEMORY;

	    if ((p->Codec.In.Format.Format.Video.Pixel.Flags & PF_FRAGMENTED) && 
			(Codec->capabilities & CODEC_CAP_TRUNCATED))
			p->Context->flags|= CODEC_FLAG_TRUNCATED;

		UpdateSettings(p);
		p->Context->palctrl = NULL;
	    p->Context->bit_rate = 0;
		p->Context->extradata = p->Codec.In.Format.Extra;
		p->Context->extradata_size = p->Codec.In.Format.ExtraLength;
		p->Context->width = p->Codec.In.Format.Format.Video.Width;
		p->Context->height = p->Codec.In.Format.Format.Video.Height;
		p->Context->bits_per_sample = p->Codec.In.Format.Format.Video.Pixel.BitCount;
		if (p->Codec.In.Format.Format.Video.Pixel.Palette && 
			p->Codec.In.Format.Format.Video.Pixel.BitCount<=8)
		{
			int i,n = 1 << p->Codec.In.Format.Format.Video.Pixel.BitCount;
			for (i=0;i<n;++i)
				p->Palette.palette[i] = INT32LE(p->Codec.In.Format.Format.Video.Pixel.Palette[i].v);
			p->Palette.palette_changed = 1;
			p->Context->palctrl = &p->Palette;
		}

		p->CodecId = i->CodecId;

	    if (avcodec_open(p->Context,Codec)<0)
		{
			// avoid calling avcodec_close at next UpdateInput
		    av_free(p->Context);
			p->Context = NULL;
			return ERR_INVALID_DATA;
		}

		if (!BuildOutputFormat(p))
			return ERR_INVALID_DATA;

		p->SkipToKey = 1;
		p->DropToKey = 1;
		p->Dropping = 0;
	}

	return ERR_NONE;
}

static INLINE bool_t SupportDrop( ffmpeg_video* p )
{
	return p->CodecId != CODEC_ID_H264 && (!p->Context->has_b_frames || p->CodecId != CODEC_ID_SVQ3);
}

static int Process( ffmpeg_video* p, const packet* Packet, const flowstate* State )
{
	int Picture;
	int Len;

	if (Packet)
	{
		if (State->DropLevel)
		{
			if (State->DropLevel>1)
			{
				p->SkipToKey = 1;
				p->DropToKey = 1;
				p->Dropping = 1;
				p->Context->hurry_up = 5;
			}
			else
				p->Context->hurry_up = 1;
			if (!SupportDrop(p))
				p->Context->hurry_up = 0;
		}
		else
			p->Context->hurry_up = 0;

		if (!Packet->Key && p->DropToKey)
		{
			if (p->Dropping)
			{
				flowstate DropState;
				DropState.CurrTime = TIME_UNKNOWN;
				DropState.DropLevel = 1;
				p->Codec.Out.Process(p->Codec.Out.Pin.Node,NULL,&DropState);
			}
			if (SupportDrop(p))
				avcodec_flush_buffers(p->Context);
			return ERR_DROPPING;
		}

		if (p->DropToKey)
			p->DropToKey = 0;

		if (Packet->RefTime >= 0)
			p->Codec.Packet.RefTime = Packet->RefTime;

		BufferPack(&p->Buffer,0);
		BufferWrite(&p->Buffer,Packet->Data[0],Packet->Length,2048);
	}
	else
	{
		if (p->FrameTime<0)
			p->Codec.Packet.RefTime = TIME_UNKNOWN;
		else
		if (!State)
			p->Codec.Packet.RefTime += p->FrameTime;

		if (!State && p->Buffer.WritePos == p->Buffer.ReadPos)
			return ERR_NEED_MORE_DATA;
	}

	if (p->SkipToKey)
		p->Picture->pict_type = 0;

	Len = avcodec_decode_video(p->Context, p->Picture, &Picture, p->Buffer.Data + p->Buffer.ReadPos, 
		p->Buffer.WritePos - p->Buffer.ReadPos);

	if (Len < 0)
	{
		BufferDrop(&p->Buffer);
		return ERR_INVALID_DATA;
	}

	p->Buffer.ReadPos += Len;

	if (!Picture)
	{
		if (p->SkipToKey>1 && p->Picture->pict_type)
			--p->SkipToKey;

		return ERR_NEED_MORE_DATA;
	}

	if (p->SkipToKey>0)
	{
		if ((!p->Picture->key_frame && p->Picture->pict_type) || p->SkipToKey>1)
		{
			if (p->SkipToKey>1)
				--p->SkipToKey;
			if (p->Dropping)
			{
				flowstate DropState;
				DropState.CurrTime = TIME_UNKNOWN;
				DropState.DropLevel = 1;
				p->Codec.Out.Process(p->Codec.Out.Pin.Node,NULL,&DropState);
			}
			return ERR_DROPPING;
		}
		p->SkipToKey = 0;
	}

	if (p->Context->pix_fmt != p->PixelFormat ||
		p->Context->sample_aspect_ratio.num != p->Aspect.num ||
		p->Context->sample_aspect_ratio.den != p->Aspect.den ||
		p->Context->width != p->Codec.Out.Format.Format.Video.Width ||
		p->Context->height != p->Codec.Out.Format.Format.Video.Height ||
		p->Picture->linesize[0] != p->Codec.Out.Format.Format.Video.Pitch)
	{
		if (!BuildOutputFormat(p))
			return ERR_INVALID_DATA;

		ConnectionUpdate(&p->Codec.Node,CODEC_OUTPUT,p->Codec.Out.Pin.Node,p->Codec.Out.Pin.No);
	}

	p->Codec.Packet.Data[0] = p->Picture->data[0];
	p->Codec.Packet.Data[1] = p->Picture->data[1];
	p->Codec.Packet.Data[2] = p->Picture->data[2];
	return ERR_NONE;
}

static int ReSend( ffmpeg_video* p )
{
	flowstate State;

	if (p->SkipToKey || !p->Codec.Out.Pin.Node || !p->Picture->data[0])
		return ERR_NEED_MORE_DATA;

	State.CurrTime = TIME_RESEND;
	State.DropLevel = 0;

	p->Codec.Packet.RefTime = TIME_UNKNOWN;
	p->Codec.Packet.Data[0] = p->Picture->data[0];
	p->Codec.Packet.Data[1] = p->Picture->data[1];
	p->Codec.Packet.Data[2] = p->Picture->data[2];

	return p->Codec.Out.Process(p->Codec.Out.Pin.Node,&p->Codec.Packet,&State);
}

static int Flush( ffmpeg_video* p )
{
	p->SkipToKey = 1;
	p->DropToKey = 1;
	p->Dropping = 0;
	if (p->Context)
	{
		if (SupportDrop(p))
			avcodec_flush_buffers(p->Context);
		if (p->Context->has_b_frames && p->Context->frame_number>0)
			p->SkipToKey = 2;
	}
	BufferDrop(&p->Buffer);
	return ERR_NONE;
}

static int Set(ffmpeg_video* p, int No, const void* Data, int Size)
{
	int Result = CodecSet(&p->Codec,No,Data,Size);
	switch (No)
	{
	case NODE_SETTINGSCHANGED: 
		if (p->Context)
			UpdateSettings(p);
		break;
	}
	return Result;
}

static int Create( ffmpeg_video* p )
{
	p->Codec.Node.Set = (nodeset)Set;
	p->Codec.Process = (packetprocess)Process;
	p->Codec.UpdateInput = (nodefunc)UpdateInput;
	p->Codec.Flush = (nodefunc)Flush;
	p->Codec.ReSend = (nodefunc)ReSend;
	p->Codec.NoHardDropping = 1;
	return ERR_NONE;
}

static const nodedef FFMPEGVideo =
{
	sizeof(ffmpeg_video)|CF_ABSTRACT,
	FFMPEG_VIDEO_CLASS,
	CODEC_CLASS,
	PRI_DEFAULT,
	(nodecreate)Create,
	NULL,
};

void FFMPEG_Init()
{
	nodedef Def;
	const codecinfo* i;

	avcodec_init();
	register_avcodec(&flv_decoder);

	NodeRegisterClass(&FFMPEGVideo);
	memset(&Def,0,sizeof(Def));

	for (i=Info;i->Id;++i)
	{
		StringAdd(1,i->Id,NODE_NAME,i->Name);
		StringAdd(1,i->Id,NODE_CONTENTTYPE,i->ContentType);

		Def.Class = i->Id;
		Def.ParentClass = FFMPEG_VIDEO_CLASS;
		Def.Priority = PRI_DEFAULT-10; // do not override ARM optimized codecs by default
		Def.Flags = 0; // parent size

		if ((i->CodecId == CODEC_ID_WMV1 && QueryPlatform(PLATFORM_WMPVERSION)!=10) || //WMP10 RGB only output -> prefer ffmpeg
			i->CodecId == CODEC_ID_WMV2 ||
			i->CodecId == CODEC_ID_WMV3)
			Def.Priority -= 100; // prefer DMO, WMV2 J-frames are not supported by ffmpeg, WMMX support by MS codecs are faster

		NodeRegisterClass(&Def);
	}
}

void FFMPEG_Done()
{
	NodeUnRegisterClass(FFMPEG_VIDEO_CLASS);
	av_free_static();
}

//only function needed from imgconvert.c
void avcodec_get_chroma_sub_sample(int pix_fmt, int *h_shift, int *v_shift)
{
	switch (pix_fmt)
	{
    case PIX_FMT_YUV420P:
    case PIX_FMT_YUVJ420P:
		*h_shift = 1;
		*v_shift = 1;
		break;
    case PIX_FMT_YUVJ422P:
    case PIX_FMT_YUV422P:
    case PIX_FMT_YUV422:
    case PIX_FMT_UYVY422:
		*h_shift = 1;
		*v_shift = 0;
		break;
    case PIX_FMT_YUV410P:
		*h_shift = 2;
		*v_shift = 2;
		break;
    case PIX_FMT_YUV411P:
    case PIX_FMT_UYVY411:
		*h_shift = 2;
		*v_shift = 0;
		break;
	default:
		*h_shift = 0;
		*v_shift = 0;
		break;
	}
}

int avpicture_fill(AVPicture *picture, uint8_t *ptr, int pix_fmt, int width, int height)
{
	int h,v;
    int size = width*height;
    int sizeuv;

    switch (pix_fmt) 
	{
    case PIX_FMT_YUV410P:
    case PIX_FMT_YUV411P:
    case PIX_FMT_YUV420P:
    case PIX_FMT_YUV422P:
    case PIX_FMT_YUV444P:
		avcodec_get_chroma_sub_sample(pix_fmt,&h,&v);
        sizeuv = RSHIFT_ROUND(width,h)*RSHIFT_ROUND(height,v);
        picture->data[0] = ptr;
        picture->data[1] = ptr + size;
        picture->data[2] = ptr + size + sizeuv;
        picture->linesize[0] = width;
        picture->linesize[1] = RSHIFT_ROUND(width,h);
        picture->linesize[2] = RSHIFT_ROUND(width,h);
        return size + 2*sizeuv;
	default:
		assert(0);
		return -1;
    }
}

int avpicture_get_size(int pix_fmt, int width, int height)
{
    AVPicture i;
    return avpicture_fill(&i, NULL, pix_fmt, width, height);
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
美女网站一区二区| 欧美日韩成人一区二区| 欧洲亚洲精品在线| 精品久久久久久综合日本欧美| 国产欧美日韩不卡| 午夜欧美电影在线观看| 国产不卡视频一区二区三区| 欧美日韩精品一区视频| 亚洲欧洲日韩一区二区三区| 六月丁香综合在线视频| 欧美日韩在线观看一区二区| 国产精品女主播av| 国产真实乱子伦精品视频| 欧美色倩网站大全免费| 中文字幕五月欧美| 国产成人av电影在线播放| 91精品婷婷国产综合久久| 亚洲欧美经典视频| www.欧美日韩国产在线| 国产日韩影视精品| 国产在线视视频有精品| 欧美一区二区三区免费视频 | 成人免费黄色大片| 久久一夜天堂av一区二区三区| 亚洲成av人片在www色猫咪| 91欧美激情一区二区三区成人| 久久精品无码一区二区三区| 激情文学综合丁香| 精品欧美乱码久久久久久| 日本女优在线视频一区二区| 精品视频资源站| 一区二区三区四区在线| 色嗨嗨av一区二区三区| 亚洲欧美日韩在线不卡| 91在线精品秘密一区二区| 亚洲欧洲日韩女同| 91精品1区2区| 亚洲一区影音先锋| 在线精品亚洲一区二区不卡| 亚洲一区二区三区四区中文字幕| 91麻豆免费观看| 亚洲青青青在线视频| 色综合天天性综合| 亚洲一区在线视频| 91精品麻豆日日躁夜夜躁| 日韩av网站在线观看| 精品成人佐山爱一区二区| 国产精品亚洲午夜一区二区三区| 国产婷婷色一区二区三区四区| 国产91丝袜在线播放九色| 国产精品女人毛片| 在线视频一区二区三| 天天色天天操综合| 精品日韩一区二区| 国产乱码精品一区二区三 | 欧美一级夜夜爽| 美女在线视频一区| 欧美激情艳妇裸体舞| 91免费观看视频在线| 亚洲自拍偷拍欧美| 欧美成人在线直播| 99v久久综合狠狠综合久久| 亚洲午夜影视影院在线观看| 欧美日韩亚洲高清一区二区| 久久精品国产一区二区| 国产精品视频第一区| 欧美日韩一区 二区 三区 久久精品| 午夜av一区二区| 久久久久久久电影| 91成人免费电影| 狠狠色狠狠色综合日日91app| 中文字幕av不卡| 717成人午夜免费福利电影| 国产综合色精品一区二区三区| 最新不卡av在线| 日韩欧美在线123| 99re这里只有精品首页| 免费人成精品欧美精品| 国产精品日韩成人| 欧美精品成人一区二区三区四区| 高潮精品一区videoshd| 亚洲成人免费看| 国产精品美日韩| 欧美一区二区女人| 91小宝寻花一区二区三区| 蜜桃91丨九色丨蝌蚪91桃色| 亚洲久草在线视频| 久久婷婷国产综合国色天香 | 99麻豆久久久国产精品免费优播| 亚洲一区二区三区中文字幕| 日本一区二区三区高清不卡| 91精品国产综合久久婷婷香蕉 | 欧美人与z0zoxxxx视频| 国产精品一区二区你懂的| 亚洲v中文字幕| 亚洲欧美另类久久久精品2019| 久久久久久免费网| 欧美福利一区二区| 欧美亚州韩日在线看免费版国语版| 国产乱码精品一区二区三区忘忧草| 婷婷丁香久久五月婷婷| 一区二区三区四区在线播放| 国产精品久久久久影院色老大| 精品久久人人做人人爱| 欧美一区二区三区小说| 欧美色窝79yyyycom| 色综合视频在线观看| 99麻豆久久久国产精品免费| 国产91精品久久久久久久网曝门| 久久se精品一区精品二区| 日本欧美一区二区三区乱码| 午夜影院在线观看欧美| 亚洲一区在线视频| 亚洲精品成人a在线观看| 最新中文字幕一区二区三区| 国产精品久久久久影视| 亚洲欧洲无码一区二区三区| 中文字幕不卡在线播放| 中文字幕在线不卡视频| 国产精品拍天天在线| 亚洲欧洲一区二区在线播放| 中文字幕视频一区| 一区二区三区在线免费观看| 亚洲乱码国产乱码精品精小说| 亚洲丝袜制服诱惑| 一区二区三区在线播| 亚洲444eee在线观看| 婷婷久久综合九色国产成人 | 欧美日韩免费视频| 欧美日本一道本| 欧美一区二区视频在线观看2022 | 欧美一区二区黄色| 精品国内二区三区| 国产欧美日韩在线| 综合色中文字幕| 亚洲国产综合人成综合网站| 国产麻豆日韩欧美久久| 成人手机电影网| 91久久精品一区二区| 欧美日韩高清在线| 精品欧美一区二区三区精品久久| 精品国产乱码久久久久久久久 | 国产三级一区二区| 亚洲人吸女人奶水| 婷婷综合五月天| 狠狠狠色丁香婷婷综合激情| 成人免费精品视频| 欧美另类高清zo欧美| 精品国产乱码久久久久久影片| 欧美国产精品专区| 一区二区三区高清在线| 奇米一区二区三区| 播五月开心婷婷综合| 欧美日韩亚洲不卡| 国产欧美日韩精品a在线观看| 亚洲影视在线观看| 国产资源在线一区| 在线观看网站黄不卡| 久久蜜桃一区二区| 亚洲第一久久影院| 粉嫩av一区二区三区在线播放| 欧美羞羞免费网站| 国产亚洲精品aa| 日韩电影免费一区| 91一区在线观看| 久久亚洲影视婷婷| 日韩国产精品久久久| kk眼镜猥琐国模调教系列一区二区| 7777精品伊人久久久大香线蕉的 | 国产精品99久久久| 欧美三级电影精品| 中文字幕一区av| 国产一区二区影院| 欧美高清hd18日本| 亚洲一区二区综合| 岛国精品在线播放| 久久欧美一区二区| 日韩影视精彩在线| 欧美中文字幕一区| 亚洲桃色在线一区| 粉嫩一区二区三区在线看| 日韩片之四级片| 午夜视频在线观看一区二区三区| 国产成人av电影在线观看| 制服丝袜激情欧洲亚洲| 又紧又大又爽精品一区二区| 国产成人啪午夜精品网站男同| 日韩欧美电影在线| 日韩精品一级二级| 欧美日韩美女一区二区| 一区二区三区av电影 | 九九**精品视频免费播放| 欧美色图在线观看| 亚洲欧美国产高清| 91免费看`日韩一区二区| 美女免费视频一区| 日韩免费视频线观看| 男女激情视频一区| 欧美一区二区三区四区视频| 日韩有码一区二区三区|