/*
* Copyright (c) 2000-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
*/
/**
* @file
* multimedia converter based on the FFmpeg libraries
*/
#include "config.h"
#include <ctype.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <errno.h>
#include <limits.h>
#include <stdint.h>
#include <stdarg.h>
#if HAVE_ISATTY
#if HAVE_IO_H
#include <io.h>
#endif
#if HAVE_UNISTD_H
#include <unistd.h>
#endif
#endif
#include "libavformat/avformat.h"
#include "libavdevice/avdevice.h"
#include "libswresample/swresample.h"
#include "libavutil/opt.h"
#include "libavutil/channel_layout.h"
#include "libavutil/parseutils.h"
#include "libavutil/samplefmt.h"
#include "libavutil/fifo.h"
#include "libavutil/intreadwrite.h"
#include "libavutil/dict.h"
#include "libavutil/mathematics.h"
#include "libavutil/pixdesc.h"
#include "libavutil/avstring.h"
#include "libavutil/libm.h"
#include "libavutil/imgutils.h"
#include "libavutil/timestamp.h"
#include "libavutil/bprint.h"
#include "libavutil/time.h"
#include "libavutil/threadmessage.h"
#include "libavformat/os_support.h"
# include "libavfilter/avcodec.h"
# include "libavfilter/avfilter.h"
# include "libavfilter/buffersrc.h"
# include "libavfilter/buffersink.h"
#if HAVE_SYS_RESOURCE_H
#include <sys/time.h>
#include <sys/types.h>
#include <sys/resource.h>
#elif HAVE_GETPROCESSTIMES
#include <windows.h>
#endif
#if HAVE_GETPROCESSMEMORYINFO
#include <windows.h>
#include <psapi.h>
#endif
#if HAVE_SYS_SELECT_H
#include <sys/select.h>
#endif
#if HAVE_TERMIOS_H
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/time.h>
#include <termios.h>
#elif HAVE_KBHIT
#include <conio.h>
#endif
#if HAVE_PTHREADS
#include <pthread.h>
#endif
#include <time.h>
#include "ffmpeg.h"
#include "cmdutils.h"
#include "libavutil/avassert.h"
const char program_name[] = "ffmpeg";
const int program_birth_year = 2000;
static FILE *vstats_file;
const char *const forced_keyframes_const_names[] = {
"n",
"n_forced",
"prev_forced_n",
"prev_forced_t",
"t",
NULL
};
static void do_video_stats(OutputStream *ost, int frame_size);
static int64_t getutime(void);
static int64_t getmaxrss(void);
static int run_as_daemon = 0;
static int nb_frames_dup = 0;
static int nb_frames_drop = 0;
static int64_t decode_error_stat[2];
static int current_time;
AVIOContext *progress_avio = NULL;
static uint8_t *subtitle_out;
#define DEFAULT_PASS_LOGFILENAME_PREFIX "ffmpeg2pass"
InputStream **input_streams = NULL;
int nb_input_streams = 0;
InputFile **input_files = NULL;
int nb_input_files = 0;
OutputStream **output_streams = NULL;
int nb_output_streams = 0;
OutputFile **output_files = NULL;
int nb_output_files = 0;
FilterGraph **filtergraphs;
int nb_filtergraphs;
#if HAVE_TERMIOS_H
/* init terminal so that we can grab keys */
static struct termios oldtty;
static int restore_tty;
#endif
#if HAVE_PTHREADS
static void free_input_threads(void);
#endif
/* sub2video hack:
Convert subtitles to video with alpha to insert them in filter graphs.
This is a temporary solution until libavfilter gets real subtitles support.
*/
static int sub2video_get_blank_frame(InputStream *ist)
{
int ret;
AVFrame *frame = ist->sub2video.frame;
av_frame_unref(frame);
ist->sub2video.frame->width = ist->sub2video.w;
ist->sub2video.frame->height = ist->sub2video.h;
ist->sub2video.frame->format = AV_PIX_FMT_RGB32;
if ((ret = av_frame_get_buffer(frame, 32)) < 0)
return ret;
memset(frame->data[0], 0, frame->height * frame->linesize[0]);
return 0;
}
static void sub2video_copy_rect(uint8_t *dst, int dst_linesize, int w, int h,
AVSubtitleRect *r)
{
uint32_t *pal, *dst2;
uint8_t *src, *src2;
int x, y;
if (r->type != SUBTITLE_BITMAP) {
av_log(NULL, AV_LOG_WARNING, "sub2video: non-bitmap subtitle\n");
return;
}
if (r->x < 0 || r->x + r->w > w || r->y < 0 || r->y + r->h > h) {
av_log(NULL, AV_LOG_WARNING, "sub2video: rectangle overflowing\n");
return;
}
dst += r->y * dst_linesize + r->x * 4;
src = r->pict.data[0];
pal = (uint32_t *)r->pict.data[1];
for (y = 0; y < r->h; y++) {
dst2 = (uint32_t *)dst;
src2 = src;
for (x = 0; x < r->w; x++)
*(dst2++) = pal[*(src2++)];
dst += dst_linesize;
src += r->pict.linesize[0];
}
}
static void sub2video_push_ref(InputStream *ist, int64_t pts)
{
AVFrame *frame = ist->sub2video.frame;
int i;
av_assert1(frame->data[0]);
ist->sub2video.last_pts = frame->pts = pts;
for (i = 0; i < ist->nb_filters; i++)
av_buffersrc_add_frame_flags(ist->filters[i]->filter, frame,
AV_BUFFERSRC_FLAG_KEEP_REF |
AV_BUFFERSRC_FLAG_PUSH);
}
static void sub2video_update(InputStream *ist, AVSubtitle *sub)
{
int w = ist->sub2video.w, h = ist->sub2video.h;
AVFrame *frame = ist->sub2video.frame;
int8_t *dst;
int dst_linesize;
int num_rects, i;
int64_t pts, end_pts;
if (!frame)
return;
if (sub) {
pts = av_rescale_q(sub->pts + sub->start_display_time * 1000LL,
AV_TIME_BASE_Q, ist->st->time_base);
end_pts = av_rescale_q(sub->pts + sub->end_display_time * 1000LL,
AV_TIME_BASE_Q, ist->st->time_base);
num_rects = sub->num_rects;
} else {
pts = ist->sub2video.end_pts;
end_pts = INT64_MAX;
num_rects = 0;
}
if (sub2video_get_blank_frame(ist) < 0) {
av_log(ist->dec_ctx, AV_LOG_ERROR,
"Impossible to get a blank canvas.\n");
return;
}
dst = frame->data [0];
dst_linesize = frame->linesize[0];
for (i = 0; i < num_rects; i++)
sub2video_copy_rect(dst, dst_linesize, w, h, sub->rects[i]);
sub2video_push_ref(ist, pts);
ist->sub2video.end_pts = end_pts;
}
static void sub2video_heartbeat(InputStream *ist, int64_t pts)
{
InputFile *infile = input_files[ist->file_index];
int i, j, nb_reqs;
int64_t pts2;
/* When a frame is read from a file, examine all sub2video streams in
the same file and send the sub2video frame again. Otherwise, decoded
video frames could be accumulating in the filter graph while a filter
(possibly overlay) is desperately waiting for a subtitle frame. */
for (i = 0; i < infile->nb_streams; i++) {
InputStream *ist2 = input_streams[infile->ist_index + i];
if (!ist2->sub2video.frame)
continue;
/* subtitles seem to be usually muxed ahead of other streams;
if not, subtracting a larger time here is necessary */
pts2 = av_rescale_q(pts, ist->st->time_base, ist2->st->time_base) - 1;
/* do not send the heartbeat frame if the subtitle is already ahead */
if (pts2 <= ist2->sub2video.last_pts)
continue;
if (pts2 >= ist2->sub2video.end_pts || !ist2->sub2video.frame->data[0])
sub2video_update(ist2, NULL);
for (j = 0, nb_reqs = 0; j < ist2->nb_filters; j++)
nb_reqs
没有合适的资源?快使用搜索试试~ 我知道了~
ffmpeg编译使用实例
共880个文件
h:484个
so:89个
class:75个
需积分: 10 13 下载量 199 浏览量
2016-07-29
17:26:12
上传
评论
收藏 93.54MB RAR 举报
温馨提示
ffmpeg编译使用实例,教你如何使用jni编译ffmpeg,进行视频格式转换,压缩,加水印等等
资源推荐
资源详情
资源评论
收起资源包目录
ffmpeg编译使用实例 (880个子文件)
resources.ap_ 66KB
resources.ap_ 66KB
resources.ap_ 66KB
resources.ap_ 66KB
resources.ap_ 65KB
resources.ap_ 52KB
SFFmpegAndroidTranscoder.apk 4.63MB
SFFmpegAndroidStreamer.apk 4.55MB
SFFmpegAndroidDecoder.apk 4.55MB
SFFmpegAndroidEncoder.apk 4.54MB
SFFmpegAndroidDecoderOnelib.apk 3.98MB
SAndroidPlayer.apk 298KB
ffmpeg_mod.c 146KB
ffmpeg_opt.c 123KB
cmdutils.c 69KB
ffmpeg_filter.c 37KB
simplest_ffmpeg_encoder.c 7KB
simplest_ffmpeg_decoder.c 6KB
simplest_ffmpeg_decoder.c 6KB
simplest_ffmpeg_streamer.c 6KB
strtod.c 3KB
getopt.c 2KB
ffmpeg_jni.c 2KB
jarlist.cache 120B
jarlist.cache 120B
MainActivity$1.class 2KB
MainActivity.class 2KB
MainActivity.class 2KB
MainActivity.class 2KB
MainActivity.class 2KB
MainActivity$1.class 2KB
MainActivity$1.class 2KB
MainActivity$1.class 2KB
MainActivity$1.class 2KB
MainActivity.class 2KB
MainActivity.class 2KB
MainActivity$1.class 2KB
MainActivity$4.class 1007B
MainActivity$2.class 1000B
MainActivity$3.class 1000B
R.class 923B
R.class 903B
R.class 893B
R.class 893B
R.class 893B
R$id.class 832B
R.class 823B
R$string.class 680B
R$string.class 680B
R$id.class 679B
R$id.class 668B
R$id.class 665B
R$id.class 665B
R$string.class 641B
R$id.class 608B
R$string.class 547B
R$string.class 541B
R$string.class 538B
R$dimen.class 536B
R$dimen.class 530B
R$dimen.class 527B
R$dimen.class 527B
R$dimen.class 527B
R$style.class 506B
R$dimen.class 506B
R$style.class 500B
R$style.class 497B
R$style.class 497B
R$style.class 497B
R$drawable.class 482B
R$layout.class 478B
R$style.class 476B
R$drawable.class 476B
R$drawable.class 473B
R$drawable.class 473B
R$drawable.class 473B
R$layout.class 472B
R$layout.class 469B
R$layout.class 469B
R$layout.class 469B
R$menu.class 463B
R$menu.class 457B
R$menu.class 454B
R$menu.class 454B
R$menu.class 454B
R$drawable.class 452B
R$layout.class 448B
R$menu.class 433B
R$attr.class 415B
R$attr.class 409B
R$attr.class 406B
R$attr.class 406B
R$attr.class 406B
BuildConfig.class 395B
BuildConfig.class 391B
BuildConfig.class 389B
BuildConfig.class 389B
BuildConfig.class 389B
R$attr.class 385B
BuildConfig.class 375B
共 880 条
- 1
- 2
- 3
- 4
- 5
- 6
- 9
资源评论
非花非雾--
- 粉丝: 144
- 资源: 124
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功