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

📄 ffplay.c

📁 symbian下ffmpeg编程。。废了好大劲下下来的!。
💻 C
📖 第 1 页 / 共 5 页
字号:
/* * FFplay : Simple Media Player based on the ffmpeg libraries * Copyright (c) 2003 Fabrice Bellard * * This file is part of FFmpeg. * * FFmpeg 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. * * FFmpeg 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 FFmpeg; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */#define HAVE_AV_CONFIG_H#include "ffplay.h"void show_help(void);static int audio_write_get_buf_size(VideoState *is);void print_error(const char *filename, int err);/* options specified by the user */static AVInputFormat *file_iformat;static const char *input_filename;static int fs_screen_width;static int fs_screen_height;//static int screen_width = 640;//static int screen_height = 480;static int audio_disable;static int video_disable;static int seek_by_bytes;static int display_disable;static int show_status;static int av_sync_type = AV_SYNC_AUDIO_MASTER;static int64_t start_time = AV_NOPTS_VALUE;static int debug = 0;static int debug_mv = 0;static int step = 0;static int thread_count = 1;static int workaround_bugs = 1;static int fast = 0;static int genpts = 0;static int lowres = 0;static int idct = FF_IDCT_AUTO;static enum AVDiscard skip_frame= AVDISCARD_DEFAULT;static enum AVDiscard skip_idct= AVDISCARD_DEFAULT;static enum AVDiscard skip_loop_filter= AVDISCARD_DEFAULT;static int error_resilience = FF_ER_CAREFUL;static int error_concealment = 3;/* current context */static int is_full_screen;static VideoState *cur_stream;static int64_t audio_callback_time;AVPacket flush_pkt;static SDL_Surface *screen;/* packet queue handling */static void packet_queue_init(PacketQueue *q){    memset(q, 0, sizeof(PacketQueue));    q->mutex = SDL_CreateMutex();    q->cond = SDL_CreateCond();}static void packet_queue_flush(PacketQueue *q){    AVPacketList *pkt, *pkt1;    SDL_LockMutex(q->mutex);    for(pkt = q->first_pkt; pkt != NULL; pkt = pkt1) {        pkt1 = pkt->next;        av_free_packet(&pkt->pkt);        av_freep(&pkt);    }    q->last_pkt = NULL;    q->first_pkt = NULL;    q->nb_packets = 0;    q->size = 0;    SDL_UnlockMutex(q->mutex);}static void packet_queue_end(PacketQueue *q){    packet_queue_flush(q);    SDL_DestroyMutex(q->mutex);    SDL_DestroyCond(q->cond);}static int packet_queue_put(PacketQueue *q, AVPacket *pkt){    AVPacketList *pkt1;    /* duplicate the packet */    if (pkt!=&flush_pkt && av_dup_packet(pkt) < 0)        return -1;    pkt1 = av_malloc(sizeof(AVPacketList));    if (!pkt1)        return -1;    pkt1->pkt = *pkt;    pkt1->next = NULL;    SDL_LockMutex(q->mutex);    if (!q->last_pkt)        q->first_pkt = pkt1;    else        q->last_pkt->next = pkt1;    q->last_pkt = pkt1;    q->nb_packets++;    q->size += pkt1->pkt.size;    /* XXX: should duplicate packet data in DV case */    SDL_CondSignal(q->cond);    SDL_UnlockMutex(q->mutex);    return 0;}static void packet_queue_abort(PacketQueue *q){    SDL_LockMutex(q->mutex);    q->abort_request = 1;    SDL_CondSignal(q->cond);    SDL_UnlockMutex(q->mutex);}/* return < 0 if aborted, 0 if no packet and > 0 if packet.  */static int packet_queue_get(PacketQueue *q, AVPacket *pkt, int block){    AVPacketList *pkt1;    int ret;    SDL_LockMutex(q->mutex);    for(;;) {        if (q->abort_request) {            ret = -1;            break;        }        pkt1 = q->first_pkt;        if (pkt1) {            q->first_pkt = pkt1->next;            if (!q->first_pkt)                q->last_pkt = NULL;            q->nb_packets--;            q->size -= pkt1->pkt.size;            *pkt = pkt1->pkt;            av_free(pkt1);            ret = 1;            break;        } else if (!block) {            ret = 0;            break;        } else {            SDL_CondWait(q->cond, q->mutex);        }    }    SDL_UnlockMutex(q->mutex);    return ret;}static inline void fill_rectangle(SDL_Surface *screen,                                  int x, int y, int w, int h, int color){    SDL_Rect rect;    rect.x = x;    rect.y = y;    rect.w = w;    rect.h = h;    SDL_FillRect(screen, &rect, color);}#if 0/* draw only the border of a rectangle */void fill_border(VideoState *s, int x, int y, int w, int h, int color){    int w1, w2, h1, h2;    /* fill the background */    w1 = x;    if (w1 < 0)        w1 = 0;    w2 = s->width - (x + w);    if (w2 < 0)        w2 = 0;    h1 = y;    if (h1 < 0)        h1 = 0;    h2 = s->height - (y + h);    if (h2 < 0)        h2 = 0;    fill_rectangle(screen,                   s->xleft, s->ytop,                   w1, s->height,                   color);    fill_rectangle(screen,                   s->xleft + s->width - w2, s->ytop,                   w2, s->height,                   color);    fill_rectangle(screen,                   s->xleft + w1, s->ytop,                   s->width - w1 - w2, h1,                   color);    fill_rectangle(screen,                   s->xleft + w1, s->ytop + s->height - h2,                   s->width - w1 - w2, h2,                   color);}#endif#define SCALEBITS 10#define ONE_HALF  (1 << (SCALEBITS - 1))#define FIX(x)    ((int) ((x) * (1<<SCALEBITS) + 0.5))#define RGB_TO_Y_CCIR(r, g, b) \((FIX(0.29900*219.0/255.0) * (r) + FIX(0.58700*219.0/255.0) * (g) + \  FIX(0.11400*219.0/255.0) * (b) + (ONE_HALF + (16 << SCALEBITS))) >> SCALEBITS)#define RGB_TO_U_CCIR(r1, g1, b1, shift)\(((- FIX(0.16874*224.0/255.0) * r1 - FIX(0.33126*224.0/255.0) * g1 +         \     FIX(0.50000*224.0/255.0) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)#define RGB_TO_V_CCIR(r1, g1, b1, shift)\(((FIX(0.50000*224.0/255.0) * r1 - FIX(0.41869*224.0/255.0) * g1 -           \   FIX(0.08131*224.0/255.0) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)#define ALPHA_BLEND(a, oldp, newp, s)\((((oldp << s) * (255 - (a))) + (newp * (a))) / (255 << s))#define RGBA_IN(r, g, b, a, s)\{\    unsigned int v = ((const uint32_t *)(s))[0];\    a = (v >> 24) & 0xff;\    r = (v >> 16) & 0xff;\    g = (v >> 8) & 0xff;\    b = v & 0xff;\}#define YUVA_IN(y, u, v, a, s, pal)\{\    unsigned int val = ((const uint32_t *)(pal))[*(const uint8_t*)s];\    a = (val >> 24) & 0xff;\    y = (val >> 16) & 0xff;\    u = (val >> 8) & 0xff;\    v = val & 0xff;\}#define YUVA_OUT(d, y, u, v, a)\{\    ((uint32_t *)(d))[0] = (a << 24) | (y << 16) | (u << 8) | v;\}#define BPP 1static void blend_subrect(AVPicture *dst, const AVSubtitleRect *rect){    int wrap, wrap3, width2, skip2;    int y, u, v, a, u1, v1, a1, w, h;    uint8_t *lum, *cb, *cr;    const uint8_t *p;    const uint32_t *pal;    lum = dst->data[0] + rect->y * dst->linesize[0];    cb = dst->data[1] + (rect->y >> 1) * dst->linesize[1];    cr = dst->data[2] + (rect->y >> 1) * dst->linesize[2];    width2 = (rect->w + 1) >> 1;    skip2 = rect->x >> 1;    wrap = dst->linesize[0];    wrap3 = rect->linesize;    p = rect->bitmap;    pal = rect->rgba_palette;  /* Now in YCrCb! */    if (rect->y & 1) {        lum += rect->x;        cb += skip2;        cr += skip2;        if (rect->x & 1) {            YUVA_IN(y, u, v, a, p, pal);            lum[0] = ALPHA_BLEND(a, lum[0], y, 0);            cb[0] = ALPHA_BLEND(a >> 2, cb[0], u, 0);            cr[0] = ALPHA_BLEND(a >> 2, cr[0], v, 0);            cb++;            cr++;            lum++;            p += BPP;        }        for(w = rect->w - (rect->x & 1); w >= 2; w -= 2) {            YUVA_IN(y, u, v, a, p, pal);            u1 = u;            v1 = v;            a1 = a;            lum[0] = ALPHA_BLEND(a, lum[0], y, 0);            YUVA_IN(y, u, v, a, p + BPP, pal);            u1 += u;            v1 += v;            a1 += a;            lum[1] = ALPHA_BLEND(a, lum[1], y, 0);            cb[0] = ALPHA_BLEND(a1 >> 2, cb[0], u1, 1);            cr[0] = ALPHA_BLEND(a1 >> 2, cr[0], v1, 1);            cb++;            cr++;            p += 2 * BPP;            lum += 2;        }        if (w) {            YUVA_IN(y, u, v, a, p, pal);            lum[0] = ALPHA_BLEND(a, lum[0], y, 0);            cb[0] = ALPHA_BLEND(a >> 2, cb[0], u, 0);            cr[0] = ALPHA_BLEND(a >> 2, cr[0], v, 0);        }        p += wrap3 + (wrap3 - rect->w * BPP);        lum += wrap + (wrap - rect->w - rect->x);        cb += dst->linesize[1] - width2 - skip2;        cr += dst->linesize[2] - width2 - skip2;    }    for(h = rect->h - (rect->y & 1); h >= 2; h -= 2) {        lum += rect->x;        cb += skip2;        cr += skip2;        if (rect->x & 1) {            YUVA_IN(y, u, v, a, p, pal);            u1 = u;            v1 = v;            a1 = a;            lum[0] = ALPHA_BLEND(a, lum[0], y, 0);            p += wrap3;            lum += wrap;            YUVA_IN(y, u, v, a, p, pal);            u1 += u;            v1 += v;            a1 += a;            lum[0] = ALPHA_BLEND(a, lum[0], y, 0);            cb[0] = ALPHA_BLEND(a1 >> 2, cb[0], u1, 1);            cr[0] = ALPHA_BLEND(a1 >> 2, cr[0], v1, 1);            cb++;            cr++;            p += -wrap3 + BPP;            lum += -wrap + 1;        }        for(w = rect->w - (rect->x & 1); w >= 2; w -= 2) {            YUVA_IN(y, u, v, a, p, pal);            u1 = u;            v1 = v;            a1 = a;            lum[0] = ALPHA_BLEND(a, lum[0], y, 0);            YUVA_IN(y, u, v, a, p, pal);            u1 += u;            v1 += v;            a1 += a;            lum[1] = ALPHA_BLEND(a, lum[1], y, 0);            p += wrap3;            lum += wrap;            YUVA_IN(y, u, v, a, p, pal);            u1 += u;            v1 += v;            a1 += a;            lum[0] = ALPHA_BLEND(a, lum[0], y, 0);            YUVA_IN(y, u, v, a, p, pal);            u1 += u;            v1 += v;            a1 += a;            lum[1] = ALPHA_BLEND(a, lum[1], y, 0);            cb[0] = ALPHA_BLEND(a1 >> 2, cb[0], u1, 2);            cr[0] = ALPHA_BLEND(a1 >> 2, cr[0], v1, 2);            cb++;            cr++;            p += -wrap3 + 2 * BPP;            lum += -wrap + 2;        }        if (w) {            YUVA_IN(y, u, v, a, p, pal);            u1 = u;            v1 = v;            a1 = a;            lum[0] = ALPHA_BLEND(a, lum[0], y, 0);            p += wrap3;            lum += wrap;            YUVA_IN(y, u, v, a, p, pal);            u1 += u;            v1 += v;            a1 += a;            lum[0] = ALPHA_BLEND(a, lum[0], y, 0);            cb[0] = ALPHA_BLEND(a1 >> 2, cb[0], u1, 1);            cr[0] = ALPHA_BLEND(a1 >> 2, cr[0], v1, 1);            cb++;            cr++;            p += -wrap3 + BPP;            lum += -wrap + 1;        }        p += wrap3 + (wrap3 - rect->w * BPP);        lum += wrap + (wrap - rect->w - rect->x);        cb += dst->linesize[1] - width2 - skip2;        cr += dst->linesize[2] - width2 - skip2;    }    /* handle odd height */    if (h) {        lum += rect->x;        cb += skip2;        cr += skip2;        if (rect->x & 1) {            YUVA_IN(y, u, v, a, p, pal);            lum[0] = ALPHA_BLEND(a, lum[0], y, 0);            cb[0] = ALPHA_BLEND(a >> 2, cb[0], u, 0);            cr[0] = ALPHA_BLEND(a >> 2, cr[0], v, 0);            cb++;            cr++;            lum++;            p += BPP;        }        for(w = rect->w - (rect->x & 1); w >= 2; w -= 2) {            YUVA_IN(y, u, v, a, p, pal);

⌨️ 快捷键说明

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