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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? libav_decoder.cpp

?? linux下實現(xiàn)視頻播放的播放器
?? CPP
字號:
/* *  Copyright (C) 2005-2007  gulikoza, mtrooper * *  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$ */#include "iptv.h"#define USES_BASECLASS#include "video.h"#include "wxgui/StreamInfo.h"#if (C_HAS_LIBAVCODEC)//#define DEBUG#include "log.h"#define MODULE "libav_decoder"/* Define to use direct buffer rendering */#define USE_DBRstatic enum PixelFormat GetFormat(AVCodecContext * s, const enum PixelFormat * fmt){    int i = -1;    do {	i++;	LOG_MSG("Codec offered format: %d", fmt[i]);    } while(fmt[i] != PIX_FMT_NONE);    return fmt[0];}static unsigned int pts = 0;static Renderer * renderer = NULL;static int GetBuffer(struct AVCodecContext *c, AVFrame *pic){    int w, h;    Frame frame;    w = frame.w = c->width; h = frame.h = c->height;    pic->pts = pts;    /* Some codecs set pix_fmt only after the 1st frame     * has been decoded, so this check is necessary. */#ifdef USE_DBR    if((renderer == NULL) || (c->pix_fmt == -1))#endif    {	pic->opaque = (void*)-1;	LOG_MSG("GetBuffer called, pts will be set to: %u, using internal buffer", pts);	return avcodec_default_get_buffer(c, pic);    }    avcodec_align_dimensions(c, &w, &h);    if(!(c->flags&CODEC_FLAG_EMU_EDGE)) {	w += 32; h += 32;	frame.edge = 16;    }    avcodec_align_dimensions(c, &w, &h);    frame.pitch = w;    renderer->LockData(&frame);    if(frame.id < 0) {	pic->opaque = (void*)-1;	LOG_MSG("GetBuffer called, pts will be set to: %u, using internal buffer", pts);	return avcodec_default_get_buffer(c, pic);    }    pic->opaque = (void*)frame.id;    LOG_MSG("GetBuffer called, pts will be set to: %u, picid: %d", pts, frame.id);    /* Who wrote a codec that writes *before* the address it has been passed?!? */    pic->data[0] = frame.data[0] +  (frame.edge * frame.pitch) + frame.edge;    pic->data[1] = frame.data[1] + ((frame.edge * frame.pitch)>>2) + (frame.edge>>1);    pic->data[2] = frame.data[2] + ((frame.edge * frame.pitch)>>2) + (frame.edge>>1);    pic->data[3] = NULL;    LOG_MSG("Buffers at %p %p %p", pic->data[0], pic->data[1], pic->data[2]);    pic->linesize[0] = frame.pitch;    pic->linesize[1] = frame.pitch>>1;    pic->linesize[2] = frame.pitch>>1;    pic->linesize[3] = 0;    pic->type = FF_BUFFER_TYPE_USER;    pic->age = 256*256*256*64;    return 0;}static void ReleaseBuffer(struct AVCodecContext *c, AVFrame *pic){    LOG_MSG("ReleaseBuffer called, picid: %p, data[0]: %p", pic->opaque, pic->data[0]);    if(pic->opaque == (void*)-1)	return avcodec_default_release_buffer(c, pic);    if(renderer) renderer->ReleaseData((int)PT2L(pic->opaque));    pic->data[0] = NULL;    pic->data[1] = NULL;    pic->data[2] = NULL;}static int ReGetBuffer(struct AVCodecContext *c, AVFrame *pic){    LOG_MSG("RegetBuffer called, picid: %p, data[0]: %p", pic->opaque, pic->data[0]);    if(pic->opaque == (void*)-1)	return avcodec_default_reget_buffer(c, pic);    if(pic->data[0] == NULL)	return GetBuffer(c, pic);    return 0;}int libav_decoder::Run(){    AVCodec *codec;    AVCodecContext *c = NULL;    AVFrame *picture;    // Pitcure info    int w = 0, h = 0;    int got_picture, len;#if (C_HAVE_WXGUI)    long frameSize;    Uint32 frameStartTicks;#endif    // Init libavcodec decoder    avcodec_init();    avcodec_register_all();    codec = avcodec_find_decoder(codecID);    if(!codec) {	ERROR_MSG("Unable to find a suitable codec!");	return 0;    }    c = avcodec_alloc_context();    picture = avcodec_alloc_frame();    if(avcodec_open(c, codec) < 0) {	ERROR_MSG("Unable to open codec");	return 0;    }    // Init codec    c->opaque = codec;    // Set optimal idct algorithm?    // Callback for pixel format    c->get_format = GetFormat;    // Custom get_buffer callback    c->get_buffer = GetBuffer;    c->reget_buffer = ReGetBuffer;    c->release_buffer = ReleaseBuffer;    ERROR_MSG("(ThreadID: %u) init complete", SDL_ThreadID());#ifdef DEBUG    // Frame counter, only for reference    int frames = 0;#endif    // Target surface info    Frame frame;#if (C_HAVE_WXGUI)    frameSize = 0;    frameStartTicks = SDL_GetTicks();#endif    while(ThreadRun()) {	renderer = (Renderer*)filterinfo;	// Get next packet from the fifo queue	unsigned int offset, m_size;	m_size = fifo->GetPacket(&offset, &pts);#if (C_HAVE_WXGUI)	frameSize += m_size;#endif	if((m_size == 0) || (m_size > buffersize)) {	    LOG_MSG("Error invalid packet size: %d", m_size);	    SDL_Delay(10);	    continue;	}	LockBuffer();	roffset = offset;	if(!SDL_SemValue(data))	    SDL_SemPost(data);	UnlockBuffer();	len = avcodec_decode_video(c, picture, &got_picture, buffer+offset, m_size);	if(len < 0) {	    LOG_MSG("Error while decoding frame (%d bytes dropped)", m_size);	    continue;	}	if((got_picture) && (renderer)) {	    frame.time = av_q2d(c->time_base) * 1000;	    frame.pts = picture->pts;	    LOG_MSG("Frame period set to %.2f, pts %u", frame.time, frame.pts);	    // Check for video size change	    if((w != c->width) || (h != c->height)) {		w = c->width;		h = c->height;		LOG_MSG("New picture size: %dx%d, AR: %.2f", w, h, av_q2d(c->sample_aspect_ratio));		frame.changed = true;	    }	    if(frame.aspect != ((w&0xFFFFFFE0) * av_q2d(c->sample_aspect_ratio)) / h) {		frame.aspect = ((w&0xFFFFFFE0) * av_q2d(c->sample_aspect_ratio)) / h;		frame.changed = true;	    }#if (C_HAVE_WXGUI)	    // New frame size	    if((frame.changed) && (gui.wxStreamInfo != NULL)) {		gui.wxStreamInfo->UpdateVideoStream(w, h, c->bit_rate, frame.aspect);		frameSize = 0;		frameStartTicks = SDL_GetTicks();	    }#endif	    // Picture is in internal buffers	    if(picture->opaque == (void*)-1) {		frame.pitch = frame.w = w; frame.h = h;		renderer->LockData(&frame);		if(frame.id < 0) continue;		LOG_MSG("Copying from internal buffers: %dx%d", picture->linesize[0], h);		unsigned char * src[3], * dst[3];		src[2] = picture->data[0];		src[0] = picture->data[1];		src[1] = picture->data[2];		dst[2] = frame.data[0];		dst[0] = frame.data[1];		dst[1] = frame.data[2];		register int j = h;		register int k = 0;		while(j--) {		    // Y		    SDL_memcpy(dst[2], src[2], w); dst[2] += w; src[2] += picture->linesize[0];		    // U & V		    SDL_memcpy(dst[k], src[k], w>>1); dst[k] += w>>1; src[k] += picture->linesize[1];		    k = (k+1)&1;		}	    } else {		frame.id = (int)PT2L(picture->opaque);	    }	    // Unlock target surface	    renderer->UnlockData(frame.id, &frame);	    frame.changed = false;#if (C_HAVE_WXGUI)	    Uint32 frameTimeTaken = SDL_GetTicks() - frameStartTicks;	    // Update ~twice per second	    if(frameTimeTaken > 500) {		if(gui.wxStreamInfo != NULL)		    gui.wxStreamInfo->UpdateVideoActualBitrate((long)((double)frameSize * 8000.0 / (double)frameTimeTaken));		frameSize = 0;		frameStartTicks = SDL_GetTicks();	    }#endif#ifdef DEBUG	    ++frames;#endif	}    }    if(renderer)	renderer->FlushBuffers();    avcodec_close(c);    av_free(c);    av_free(picture);    ERROR_MSG("(ThreadID: %u) finish complete", SDL_ThreadID());    return 0;}#endif // (C_HAS_LIBAVCODEC)

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
麻豆成人在线观看| 精东粉嫩av免费一区二区三区| 欧美精品自拍偷拍动漫精品| 国产在线国偷精品免费看| 一区二区在线观看免费| 久久噜噜亚洲综合| 欧美卡1卡2卡| 在线视频国内一区二区| 国产不卡视频一区| 美国十次综合导航| 亚洲bt欧美bt精品777| 日韩美女视频一区| 国产欧美视频一区二区三区| 欧美久久高跟鞋激| 色88888久久久久久影院按摩| 国内精品视频一区二区三区八戒| 亚洲丶国产丶欧美一区二区三区| 国产精品―色哟哟| 久久亚洲欧美国产精品乐播| 欧美放荡的少妇| 91久久精品国产91性色tv | 国产成人综合网站| 美女免费视频一区二区| 午夜久久久久久| 亚洲综合一区二区三区| 1区2区3区精品视频| 日本一区二区三区久久久久久久久不| 91精品福利在线一区二区三区| 色综合色狠狠天天综合色| 成人综合婷婷国产精品久久 | 成人ar影院免费观看视频| 精品在线观看免费| 毛片一区二区三区| 毛片基地黄久久久久久天堂| 日韩精品高清不卡| 日韩激情视频网站| 日日噜噜夜夜狠狠视频欧美人| 亚洲成人av免费| 亚洲成a人v欧美综合天堂| 亚洲成年人网站在线观看| 亚洲丶国产丶欧美一区二区三区| 亚洲一区在线观看免费| 亚洲成人午夜电影| 日韩精品电影在线观看| 日本美女一区二区三区视频| 视频一区二区中文字幕| 免费精品视频最新在线| 极品销魂美女一区二区三区| 精品一区二区三区不卡 | 国产精品免费av| 一区免费观看视频| 亚洲三级在线观看| 亚洲动漫第一页| 蜜臀av一级做a爰片久久| 国内精品视频666| 成人网在线播放| 97se亚洲国产综合自在线不卡| 91日韩精品一区| 欧美日韩视频在线第一区| 欧美三片在线视频观看| 91精品久久久久久久久99蜜臂| 日韩欧美综合一区| 久久久精品2019中文字幕之3| 国产精品久久久久久久第一福利 | 欧美精三区欧美精三区| 欧美一区二区三区免费在线看 | 日韩精品一区二区三区四区视频 | 国产精品久久久一区麻豆最新章节| 亚洲欧洲精品一区二区三区| 一区二区国产盗摄色噜噜| 看电影不卡的网站| 成人午夜大片免费观看| 欧美在线影院一区二区| 日韩美女一区二区三区| 国产精品理论在线观看| 亚洲成年人网站在线观看| 国内精品伊人久久久久av影院 | 欧美美女网站色| 久久久国产午夜精品| 一区二区三区免费| 久久er99精品| 菠萝蜜视频在线观看一区| 91亚洲大成网污www| 日韩视频中午一区| 中文幕一区二区三区久久蜜桃| 中文字幕在线观看一区二区| 久久久久久日产精品| 亚洲午夜在线观看视频在线| 麻豆精品在线视频| 成人精品视频一区| 欧美精品aⅴ在线视频| 久久伊99综合婷婷久久伊| 国产精品久久影院| 亚洲电影在线免费观看| 韩国三级在线一区| 日本高清不卡aⅴ免费网站| 欧美一级理论片| 中文字幕佐山爱一区二区免费| 丝袜亚洲另类欧美| 久久精品国产色蜜蜜麻豆| 在线精品视频一区二区三四| 精品欧美久久久| 亚洲天堂久久久久久久| 日本不卡免费在线视频| 99久久精品免费看| 欧美日韩高清影院| 亚洲精品在线三区| 亚洲你懂的在线视频| 国产在线日韩欧美| 欧美丝袜丝交足nylons图片| 国产精品久久久一本精品| 蜜乳av一区二区| 欧美性色黄大片手机版| 国产日产欧美一区二区三区| 亚洲成va人在线观看| 99久久综合精品| 制服丝袜亚洲色图| 亚洲丰满少妇videoshd| 成人福利视频网站| 欧美成人福利视频| 亚洲一本大道在线| 色哟哟国产精品| 国产日韩欧美精品电影三级在线 | 亚洲一区在线视频观看| 国产乱妇无码大片在线观看| 欧美性大战久久久久久久蜜臀| 中文字幕免费在线观看视频一区| 日韩综合在线视频| 欧洲激情一区二区| 亚洲色图一区二区| 一本一本久久a久久精品综合麻豆 一本一道波多野结衣一区二区 | 免费亚洲电影在线| 欧美日韩免费不卡视频一区二区三区| 国产精品欧美一区二区三区| 狠狠久久亚洲欧美| 欧美成人一区二区三区| 午夜电影网亚洲视频| 95精品视频在线| 亚洲欧洲美洲综合色网| 国产**成人网毛片九色 | 成人中文字幕合集| 国产日韩视频一区二区三区| 亚洲欧洲日韩女同| 色婷婷精品久久二区二区蜜臀av| 国产精品久久久久久久久搜平片| 国产精品一区三区| 精品国产欧美一区二区| 青椒成人免费视频| 欧美一激情一区二区三区| 激情国产一区二区| 日韩精品一区二区三区老鸭窝| 性做久久久久久久久| 欧美人伦禁忌dvd放荡欲情| 一区二区三区四区在线播放| 色综合天天综合网天天狠天天| 国产精品人妖ts系列视频| 丁香婷婷综合色啪| 国产精品拍天天在线| 91视频国产资源| 亚洲美女免费视频| 在线观看精品一区| 午夜精品在线视频一区| 欧美久久久久久久久| 毛片av一区二区| 久久日一线二线三线suv| 国产美女视频91| 精品日本一线二线三线不卡| 国产不卡视频一区二区三区| 国产精品久久久久婷婷| 色婷婷av久久久久久久| 亚洲一区av在线| 91精品国产91热久久久做人人| 五月天一区二区三区| 久久久精品国产99久久精品芒果| 懂色av一区二区夜夜嗨| 亚洲三级理论片| 欧美日韩一区三区| 久久精品99国产精品| 欧美一区二区视频在线观看| 成人免费视频国产在线观看| 成人欧美一区二区三区小说| 91行情网站电视在线观看高清版| 亚洲国产精品嫩草影院| 7777精品久久久大香线蕉| 韩日欧美一区二区三区| www国产精品av| 欧美综合视频在线观看| 麻豆91免费看| 国产精品久久久一本精品| 欧美综合视频在线观看| 日韩专区在线视频| 亚洲人被黑人高潮完整版| 制服丝袜亚洲色图| 成人va在线观看| 午夜视频久久久久久| 久久久久久免费网| 欧美一区二区三区电影| 99久久伊人精品| 日本一区中文字幕| 久久午夜羞羞影院免费观看|