ffmpeg 分析学习1225.docx
- 文档编号:12055692
- 上传时间:2023-04-16
- 格式:DOCX
- 页数:12
- 大小:16.95KB
ffmpeg 分析学习1225.docx
《ffmpeg 分析学习1225.docx》由会员分享,可在线阅读,更多相关《ffmpeg 分析学习1225.docx(12页珍藏版)》请在冰豆网上搜索。
ffmpeg分析学习1225
ffmpeg分析学习-2014-12-25
intranscode_step()call:
//version2.4.3
/*
*Return
*-0--onepacketwasreadandprocessed
*-AVERROR(EAGAIN)--nopacketswereavailableforselectedfile,
*thisfunctionshouldbecalledagain
*-AVERROR_EOF--thisfunctionshouldnotbecalledagain
*/
staticintprocess_input(intfile_index)
{
InputFile*ifile=input_files[file_index];
AVFormatContext*is;
InputStream*ist;
AVPacketpkt;
intret,i,j;is=ifile->ctx;
ret=get_input_packet(ifile,&pkt);if(ret==AVERROR(EAGAIN))
{
ifile->eagain=1;
returnret;
}
if(ret<0)
{
if(ret!
=AVERROR_EOF)
{
print_error(is->filename,ret);
if(exit_on_error)
exit_program
(1);
}for(i=0;i<ifile->nb_streams;i++)
{
ist=input_streams[ifile->ist_index+i];
if(ist->decoding_needed)
{
ret=process_input_packet(ist,NULL);
if(ret>0)
return0;
}/*markalloutputsthatdon'tgothroughlavfiasfinished*/
for(j=0;j<nb_output_streams;j++)
{
OutputStream*ost=output_streams[j];if(ost->source_index==ifile->ist_index+i&&
(ost->stream_copy||ost->enc->type==AVMEDIA_TYPE_SUBTITLE))
finish_output_stream(ost);
}
}ifile->eof_reached=1;
returnAVERROR(EAGAIN);
}//文件已经读到结束reset_eagain();if(do_pkt_dump)
{
av_pkt_dump_log2(NULL,AV_LOG_DEBUG,&pkt,do_hex_dump,
is->streams[pkt.stream_index]);
}
/*thefollowingtestisneededincasenewstreamsappear
dynamicallyinstream:
weignorethem*/
if(pkt.stream_index>=ifile->nb_streams)
{
report_new_stream(file_index,&pkt);
gotodiscard_packet;
}ist=input_streams[ifile->ist_index+pkt.stream_index];ist->data_size+=pkt.size;
ist->nb_packets++;if(ist->discard)
gotodiscard_packet;if(debug_ts)
{
av_log(NULL,AV_LOG_INFO,"demuxer->ist_index:
%dtype:
%s"
"next_dts:
%snext_dts_time:
%snext_pts:
%snext_pts_time:
%spkt_pts:
%spkt_pts_time:
%spkt_dts:
%spkt_dts_time:
%soff:
%soff_time:
%s\n",
ifile->ist_index+pkt.stream_index,av_get_media_type_string(ist->dec_ctx->codec_type),
av_ts2str(ist->next_dts),av_ts2timestr(ist->next_dts,&AV_TIME_BASE_Q),
av_ts2str(ist->next_pts),av_ts2timestr(ist->next_pts,&AV_TIME_BASE_Q),
av_ts2str(pkt.pts),av_ts2timestr(pkt.pts,&ist->st->time_base),
av_ts2str(pkt.dts),av_ts2timestr(pkt.dts,&ist->st->time_base),
av_ts2str(input_files[ist->file_index]->ts_offset),
av_ts2timestr(input_files[ist->file_index]->ts_offset,&AV_TIME_BASE_Q));
}if(!
ist->wrap_correction_done&&is->start_time!
=AV_NOPTS_VALUE&&ist->st->pts_wrap_bits<64)
{
int64_tstime,stime2;
//Correctingstarttimebasedontheenabledstreams
//FIXMEthisideallyshouldbedonebeforethefirstuseofstarttimebutwedonotknowwhichare//theenabledstreamsatthatpoint.
//soweinsteaddoithereaspartofdiscontinuityhandling
if(ist->next_dts==AV_NOPTS_VALUE
&&ifile->ts_offset==-is->start_time
&&(is->iformat->flags&AVFMT_TS_DISCONT))
{
int64_tnew_start_time=INT64_MAX;
for(i=0;i<is->nb_streams;i++)
{
AVStream*st=is->streams[i];
if(st->discard==AVDISCARD_ALL||st->start_time==AV_NOPTS_VALUE)
continue;
new_start_time=FFMIN(new_start_time,av_rescale_q(st->start_time,st->time_base,AV_TIME_BASE_Q));
}
if(new_start_time>is->start_time)
{
av_log(is,AV_LOG_VERBOSE,"Correctingstarttimeby%"PRId64"\n",new_start_time-is->start_time);
ifile->ts_offset=-new_start_time;
}
}stime=av_rescale_q(is->start_time,AV_TIME_BASE_Q,ist->st->time_base);
stime2=stime+(1ULL<<ist->st->pts_wrap_bits);
ist->wrap_correction_done=1;if(stime2>stime&&pkt.dts!
=AV_NOPTS_VALUE&&pkt.dts>stime+(1LL<<(ist->st->pts_wrap_bits-1)))
{
pkt.dts-=1ULL<<ist->st->pts_wrap_bits;
ist->wrap_correction_done=0;
}
if(stime2>stime&&pkt.pts!
=AV_NOPTS_VALUE&&pkt.pts>stime+(1LL<<(ist->st->pts_wrap_bits-1)))
{
pkt.pts-=1ULL<<ist->st->pts_wrap_bits;
ist->wrap_correction_done=0;
}
}/*addthestream-globalsidedatatothefirstpacket*/
if(ist->nb_packets==1)
{
if(ist->st->nb_side_data)
av_packet_split_side_data(&pkt);
for(i=0;i<ist->st->nb_side_data;i++)
{
AVPacketSideData*src_sd=&ist->st->side_data[i];
uint8_t*dst_data;if(av_packet_get_side_data(&pkt,src_sd->type,NULL))
continue;dst_data=av_packet_new_side_data(&pkt,src_sd->type,src_sd->size);
if(!
dst_data)
exit_program
(1);memcpy(dst_data,src_sd->data,src_sd->size);
}
}if(pkt.dts!
=AV_NOPTS_VALUE)
pkt.dts+=av_rescale_q(ifile->ts_offset,AV_TIME_BASE_Q,ist->st->time_base);
if(pkt.pts!
=AV_NOPTS_VALUE)
pkt.pts+=av_rescale_q(ifile->ts_offset,AV_TIME_BASE_Q,ist->st->time_base);if(pkt.pts!
=AV_NOPTS_VALUE)
pkt.pts*=ist->ts_scale;
if(pkt.dts!
=AV_NOPTS_VALUE)
pkt.dts*=ist->ts_scale;if(pkt.dts!
=AV_NOPTS_VALUE&&ist->next_dts==AV_NOPTS_VALUE&&!
copy_ts
&&(is->iformat->flags&AVFMT_TS_DISCONT)&&ifile->last_ts!
=AV_NOPTS_VALUE)
{
int64_tpkt_dts=av_rescale_q(pkt.dts,ist->st->time_base,AV_TIME_BASE_Q);
int64_tdelta=pkt_dts-ifile->last_ts;
if(delta<-1LL*dts_delta_threshold*AV_TIME_BASE||
(delta>1LL*dts_delta_threshold*AV_TIME_BASE&&
ist->dec_ctx->codec_type!
=AVMEDIA_TYPE_SUBTITLE))
{
ifile->ts_offset-=delta;
av_log(NULL,AV_LOG_DEBUG,
"Interstreamtimestampdiscontinuity%"PRId64",newoffset=%"PRId64"\n",
delta,ifile->ts_offset);
pkt.dts-=av_rescale_q(delta,AV_TIME_BASE_Q,ist->st->time_base);
if(pkt.pts!
=AV_NOPTS_VALUE)
pkt.pts-=av_rescale_q(delta,AV_TIME_BASE_Q,ist->st->time_base);
}
}if(pkt.dts!
=AV_NOPTS_VALUE&&ist->next_dts!
=AV_NOPTS_VALUE&&
!
copy_ts)
{
int64_tpkt_dts=av_rescale_q(pkt.dts,ist->st->time_base,AV_TIME_BASE_Q);
int64_tdelta=pkt_dts-ist->next_dts;
if(is->iformat->flags&AVFMT_TS_DISCONT)
{
if(delta<-1LL*dts_delta_threshold*AV_TIME_BASE||
(delta>1LL*dts_delta_threshold*AV_TIME_BASE&&
ist->dec_ctx->codec_type!
=AVMEDIA_TYPE_SUBTITLE)||
pkt_dts+AV_TIME_BASE/10<FFMAX(ist->pts,ist->dts))
{
ifile->ts_offset-=delta;
av_log(NULL,AV_LOG_DEBUG,
"timestampdiscontinuity%"PRId64",newoffset=%"PRId64"\n",
delta,ifile->ts_offset);
pkt.dts-=av_rescale_q(delta,AV_TIME_BASE_Q,ist->st->time_base);
if(pkt.pts!
=AV_NOPTS_VALUE)
pkt.pts-=av_rescale_q(delta,AV_TIME_BASE_Q,ist->st->time_base);
}
}else{
if(delta<-1LL*dts_error_threshold*AV_TIME_BASE||
(delta>1LL*dts_error_threshold*AV_TIME_BASE&&ist->dec_ctx->codec_type!
=AVMEDIA_TYPE_SUBTITLE)){
av_log(NULL,AV_LOG_WARNING,"DTS%"PRId64",next:
%"PRId64"st:
%dinvaliddropping\n",pkt.dts,ist->next_dts,pkt.stream_index);
pkt.dts=AV_NOPTS_VALUE;
}
if(pkt.pts!
=AV_NOPTS_VALUE){
int64_tpkt_pts=av_rescale_q(pkt.pts,ist->st->time_base,AV_TIME_BASE_Q);
delta=pkt_pts-ist->next_dts;
if(delta<-1LL*dts_error_threshold*AV_TIME_BASE||
(delta>1LL*dts_error_threshold*AV_TIME_BASE&&ist->dec_ctx->codec_type!
=AVMEDIA_TYPE_SUBTITLE)){
av_log(NULL,AV_LOG_WARNING,"PTS%"PRId64",next:
%"PRId64"invaliddroppingst:
%d\n",pkt.pts,ist->next_dts,pkt.stream_index);
pkt.pts=AV_NOPTS_VALUE;
}
}
}
}if(pkt.dts!
=AV_NOPTS_VALUE)
ifile->last_ts=av_rescale_q(pkt.dts,ist->st->time_base,AV_TIME_BASE_Q);if(debug_ts){
av_log(NULL,AV_LOG_INFO,"demuxer+ffmpeg->ist_index:
%dtype:
%spkt_pts:
%spkt_pts_time:
%spkt_dts:
%spkt_dts_time:
%soff:
%soff_time:
%s\n",
ifile->ist_index+pkt.stream_index,av_get_media_type_string(ist->dec_ctx->codec_type),
av_ts2str(pkt.pts),av_ts2timestr(pkt.pts,&ist->st->time_base),
av_ts2str(pkt.dts),av_ts2timestr(pkt.dts,&ist->st->time_base),
av_ts2str(input_files[ist->file_index]->ts_offset),
av_ts2timestr(input_files[ist->file_index]->ts_offset,&AV_TIME_BASE_Q));
}sub2video_heartbeat(ist,pkt.pts);ret=process_input_packet(ist,&pkt);
if(ret<0)
{
av_log(NULL,AV_LOG_ERROR,"Errorwhiledecodingstream#%d:
%d:
%s\n",
ist->file_index,ist->st->index,av_err2str(ret));
if(exit_on_error)
exit_program
(1);
}discard_packet:
av_free_packet(&pkt);return0;
}intmain(intargc,char**argv)
{
intret;
int64_tti;register_exit(ffmpeg_cleanup);//注册退出函数setvbuf(stderr,NULL,_IONBF,0);/*win32runtimeneedsthis*/av_log_set_flags(AV_LOG_SKIP_REPEATED);
parse_loglevel(argc,argv,options);if(argc>1&&!
strcmp(argv[1],"-d")){
run_as_daemon=1;
av_log_set_callback(log_callback_null);
argc--;
argv++;
}avcodec_register_all();
#ifCONFIG_AVDEVICE
avdevice_register_all();
#endif
avfilter_register_all();
av_register_all();
avformat_network_init();show_banner(argc,argv,options);term_init();/*parseoptionsandopenallinput/outputfiles*/
ret=ffmpeg_parse_options(argc,argv);
if(ret<0)
exit_program
(1);if(nb_output_files<=0&&nb_input_files==0){
show_usage();
av_log(NULL,AV_LOG_WARNING,"Use-htogetfullhelpor,evenbetter,run'man%s'\n",program_name);
exit_program
(1);
}/*fileconverte
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ffmpeg 分析学习1225 分析 学习 1225