auto video_index = av_find_best_stream(&context, AVMEDIA_TYPE_VIDEO, -1, -1, 0, 0);\r
auto audio_index = av_find_best_stream(&context, AVMEDIA_TYPE_AUDIO, -1, -1, 0, 0);\r
\r
- if(video_index < 0)\r
- return;\r
+ if(video_index > -1)\r
+ {\r
+ auto video_context = context.streams[video_index]->codec;\r
+ auto video_stream = context.streams[video_index];\r
\r
- auto& video_context = *context.streams[video_index]->codec;\r
- auto& video_stream = *context.streams[video_index];\r
+ auto nb_frames = static_cast<double>(video_stream->duration*video_stream->time_base.num)/static_cast<double>(video_stream->time_base.den);\r
+ nb_frames = (nb_frames*video_context->time_base.den)/video_context->time_base.num;\r
+ video_stream->nb_frames = static_cast<int64_t>(nb_frames+0.5);\r
\r
- if(boost::filesystem2::path(context.filename).extension() == ".flv")\r
- {\r
- try\r
+ if(boost::filesystem2::path(context.filename).extension() == ".flv")\r
{\r
- auto meta = read_flv_meta_info(context.filename);\r
- double fps = boost::lexical_cast<double>(meta["framerate"]);\r
- video_context.time_base.num = 1000000;\r
- video_context.time_base.den = static_cast<int>(fps*1000000.0);\r
- video_stream.nb_frames = static_cast<int64_t>(boost::lexical_cast<double>(meta["duration"])*fps);\r
+ try\r
+ {\r
+ auto meta = read_flv_meta_info(context.filename);\r
+ double fps = boost::lexical_cast<double>(meta["framerate"]);\r
+ video_context->time_base.num = 1000000;\r
+ video_context->time_base.den = static_cast<int>(fps*1000000.0);\r
+ video_stream->nb_frames = static_cast<int64_t>(boost::lexical_cast<double>(meta["duration"])*fps);\r
+ }\r
+ catch(...){}\r
}\r
- catch(...){}\r
- }\r
- else\r
- {\r
- if(video_stream.nb_frames == 0)\r
- video_stream.nb_frames = (video_stream.duration*video_stream.time_base.num)/video_stream.time_base.den;\r
- \r
- if(video_stream.nb_frames == 0)\r
- video_stream.nb_frames = video_stream.duration;\r
-\r
- video_context.time_base.num *= video_context.ticks_per_frame;\r
+ else\r
+ {\r
+ video_context->time_base.num *= video_context->ticks_per_frame;\r
\r
- if(!is_sane_fps(video_context.time_base))\r
- { \r
- video_context.time_base = fix_time_base(video_context.time_base);\r
+ if(!is_sane_fps(video_context->time_base))\r
+ { \r
+ video_context->time_base = fix_time_base(video_context->time_base);\r
\r
- if(!is_sane_fps(video_context.time_base) && audio_index > -1)\r
- {\r
- auto& audio_context = *context.streams[audio_index]->codec;\r
- auto& audio_stream = *context.streams[audio_index];\r
+ if(!is_sane_fps(video_context->time_base) && audio_index > -1)\r
+ {\r
+ auto& audio_context = *context.streams[audio_index]->codec;\r
+ auto& audio_stream = *context.streams[audio_index];\r
\r
- double duration_sec = audio_stream.duration / static_cast<double>(audio_context.sample_rate);\r
+ double duration_sec = audio_stream.duration / static_cast<double>(audio_context.sample_rate);\r
\r
- video_context.time_base.num = static_cast<int>(duration_sec*100000.0);\r
- video_context.time_base.den = static_cast<int>(video_stream.nb_frames*100000);\r
+ video_context->time_base.num = static_cast<int>(duration_sec*100000.0);\r
+ video_context->time_base.den = static_cast<int>(video_stream->nb_frames*100000);\r
+ }\r
}\r
+ \r
+ //if(audio_index > -1) // Check for invalid double frame-rate\r
+ //{\r
+ // auto& audio_context = *context.streams[audio_index]->codec;\r
+ // auto& audio_stream = *context.streams[audio_index];\r
+ // \r
+ // double duration_sec = audio_stream.duration / static_cast<double>(audio_context.sample_rate);\r
+ // double fps = static_cast<double>(video_context->time_base.den) / static_cast<double>(video_context->time_base.num);\r
+\r
+ // double fps_nb_frames = static_cast<double>(duration_sec*fps);\r
+ // double stream_nb_frames = static_cast<double>(video_stream->nb_frames);\r
+ // double diff = std::abs(fps_nb_frames - stream_nb_frames*2.0);\r
+ // if(diff < fps_nb_frames*0.05)\r
+ // video_context->time_base.num *= 2;\r
+ //}\r
+ //else\r
+ //{\r
+ // video_context->time_base.den = video_stream->r_frame_rate.num;\r
+ // video_context->time_base.num = video_stream->r_frame_rate.den;\r
+ //}\r
}\r
\r
- //if(audio_index > -1) // Check for invalid double frame-rate\r
- //{\r
- // auto& audio_context = *context.streams[audio_index]->codec;\r
- // auto& audio_stream = *context.streams[audio_index];\r
- // \r
- // double duration_sec = audio_stream.duration / static_cast<double>(audio_context.sample_rate);\r
- // double fps = static_cast<double>(video_context.time_base.den) / static_cast<double>(video_context.time_base.num);\r
-\r
- // double fps_nb_frames = static_cast<double>(duration_sec*fps);\r
- // double stream_nb_frames = static_cast<double>(video_stream.nb_frames);\r
- // double diff = std::abs(fps_nb_frames - stream_nb_frames*2.0);\r
- // if(diff < fps_nb_frames*0.05)\r
- // video_context.time_base.num *= 2;\r
- //}\r
- //else\r
- //{\r
- // video_context.time_base.den = video_stream.r_frame_rate.num;\r
- // video_context.time_base.num = video_stream.r_frame_rate.den;\r
- //}\r
- }\r
+ double fps = static_cast<double>(video_context->time_base.den) / static_cast<double>(video_context->time_base.num);\r
\r
- double fps = static_cast<double>(video_context.time_base.den) / static_cast<double>(video_context.time_base.num);\r
-\r
- double closest_fps = 0.0;\r
- for(int n = 0; n < core::video_format::count; ++n)\r
- {\r
- auto format = core::video_format_desc::get(static_cast<core::video_format::type>(n));\r
+ double closest_fps = 0.0;\r
+ for(int n = 0; n < core::video_format::count; ++n)\r
+ {\r
+ auto format = core::video_format_desc::get(static_cast<core::video_format::type>(n));\r
\r
- double diff1 = std::abs(format.fps - fps);\r
- double diff2 = std::abs(closest_fps - fps);\r
+ double diff1 = std::abs(format.fps - fps);\r
+ double diff2 = std::abs(closest_fps - fps);\r
\r
- if(diff1 < diff2)\r
- closest_fps = format.fps;\r
- }\r
+ if(diff1 < diff2)\r
+ closest_fps = format.fps;\r
+ }\r
\r
- video_context.time_base.num = 1000000;\r
- video_context.time_base.den = static_cast<int>(closest_fps*1000000.0);\r
+ video_context->time_base.num = 1000000;\r
+ video_context->time_base.den = static_cast<int>(closest_fps*1000000.0);\r
+ }\r
}\r
\r
safe_ptr<AVPacket> create_packet()\r