1/*M///////////////////////////////////////////////////////////////////////////////////////
2//
3//  IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
4//
5//  By downloading, copying, installing or using the software you agree to this license.
6//  If you do not agree to this license, do not download, install,
7//  copy or use the software.
8//
9//
10//                          License Agreement
11//                For Open Source Computer Vision Library
12//
13// Copyright (C) 2000-2008, Intel Corporation, all rights reserved.
14// Copyright (C) 2009, Willow Garage Inc., all rights reserved.
15// Third party copyrights are property of their respective owners.
16//
17// Redistribution and use in source and binary forms, with or without modification,
18// are permitted provided that the following conditions are met:
19//
20//   * Redistribution's of source code must retain the above copyright notice,
21//     this list of conditions and the following disclaimer.
22//
23//   * Redistribution's in binary form must reproduce the above copyright notice,
24//     this list of conditions and the following disclaimer in the documentation
25//     and/or other materials provided with the distribution.
26//
27//   * The name of the copyright holders may not be used to endorse or promote products
28//     derived from this software without specific prior written permission.
29//
30// This software is provided by the copyright holders and contributors "as is" and
31// any express or implied warranties, including, but not limited to, the implied
32// warranties of merchantability and fitness for a particular purpose are disclaimed.
33// In no event shall the Intel Corporation or contributors be liable for any direct,
34// indirect, incidental, special, exemplary, or consequential damages
35// (including, but not limited to, procurement of substitute goods or services;
36// loss of use, data, or profits; or business interruption) however caused
37// and on any theory of liability, whether in contract, strict liability,
38// or tort (including negligence or otherwise) arising in any way out of
39// the use of this software, even if advised of the possibility of such damage.
40//
41//M*/
42
43#include "cap_ffmpeg_api.hpp"
44#if !(defined(WIN32) || defined(_WIN32) || defined(WINCE))
45# include <pthread.h>
46#endif
47#include <assert.h>
48#include <algorithm>
49#include <limits>
50
51#define CALC_FFMPEG_VERSION(a,b,c) ( a<<16 | b<<8 | c )
52
53#if defined _MSC_VER && _MSC_VER >= 1200
54#pragma warning( disable: 4244 4510 4512 4610 )
55#endif
56
57#ifdef __GNUC__
58#  pragma GCC diagnostic ignored "-Wdeprecated-declarations"
59#endif
60
61#ifdef __cplusplus
62extern "C" {
63#endif
64
65#include "ffmpeg_codecs.hpp"
66
67#include <libavutil/mathematics.h>
68
69#if LIBAVUTIL_BUILD > CALC_FFMPEG_VERSION(51,11,0)
70  #include <libavutil/opt.h>
71#endif
72
73#ifdef WIN32
74  #define HAVE_FFMPEG_SWSCALE 1
75  #include <libavcodec/avcodec.h>
76  #include <libswscale/swscale.h>
77#else
78
79#ifndef HAVE_FFMPEG_SWSCALE
80    #error "libswscale is necessary to build the newer OpenCV ffmpeg wrapper"
81#endif
82
83// if the header path is not specified explicitly, let's deduce it
84#if !defined HAVE_FFMPEG_AVCODEC_H && !defined HAVE_LIBAVCODEC_AVCODEC_H
85
86#if defined(HAVE_GENTOO_FFMPEG)
87  #define HAVE_LIBAVCODEC_AVCODEC_H 1
88  #if defined(HAVE_FFMPEG_SWSCALE)
89    #define HAVE_LIBSWSCALE_SWSCALE_H 1
90  #endif
91#elif defined HAVE_FFMPEG
92  #define HAVE_FFMPEG_AVCODEC_H 1
93  #if defined(HAVE_FFMPEG_SWSCALE)
94    #define HAVE_FFMPEG_SWSCALE_H 1
95  #endif
96#endif
97
98#endif
99
100#if defined(HAVE_FFMPEG_AVCODEC_H)
101  #include <ffmpeg/avcodec.h>
102#endif
103#if defined(HAVE_FFMPEG_SWSCALE_H)
104  #include <ffmpeg/swscale.h>
105#endif
106
107#if defined(HAVE_LIBAVCODEC_AVCODEC_H)
108  #include <libavcodec/avcodec.h>
109#endif
110#if defined(HAVE_LIBSWSCALE_SWSCALE_H)
111  #include <libswscale/swscale.h>
112#endif
113
114#endif
115
116#ifdef __cplusplus
117}
118#endif
119
120#if defined _MSC_VER && _MSC_VER >= 1200
121#pragma warning( default: 4244 4510 4512 4610 )
122#endif
123
124#ifdef NDEBUG
125#define CV_WARN(message)
126#else
127#define CV_WARN(message) fprintf(stderr, "warning: %s (%s:%d)\n", message, __FILE__, __LINE__)
128#endif
129
130/* PIX_FMT_RGBA32 macro changed in newer ffmpeg versions */
131#ifndef PIX_FMT_RGBA32
132#define PIX_FMT_RGBA32 PIX_FMT_RGB32
133#endif
134
135
136#if defined WIN32 || defined _WIN32
137    #include <windows.h>
138#elif defined __linux__ || defined __APPLE__
139    #include <unistd.h>
140    #include <stdio.h>
141    #include <sys/types.h>
142#if defined __APPLE__
143    #include <sys/sysctl.h>
144#endif
145#endif
146
147#ifndef MIN
148#define MIN(a, b) ((a) < (b) ? (a) : (b))
149#endif
150
151#if defined(__APPLE__)
152#define AV_NOPTS_VALUE_ ((int64_t)0x8000000000000000LL)
153#else
154#define AV_NOPTS_VALUE_ ((int64_t)AV_NOPTS_VALUE)
155#endif
156
157#ifndef AVERROR_EOF
158#define AVERROR_EOF (-MKTAG( 'E','O','F',' '))
159#endif
160
161#if LIBAVCODEC_BUILD >= CALC_FFMPEG_VERSION(54,25,0)
162#  define CV_CODEC_ID AVCodecID
163#  define CV_CODEC(name) AV_##name
164#else
165#  define CV_CODEC_ID CodecID
166#  define CV_CODEC(name) name
167#endif
168
169static int get_number_of_cpus(void)
170{
171#if LIBAVFORMAT_BUILD < CALC_FFMPEG_VERSION(52, 111, 0)
172    return 1;
173#elif defined WIN32 || defined _WIN32
174    SYSTEM_INFO sysinfo;
175    GetSystemInfo( &sysinfo );
176
177    return (int)sysinfo.dwNumberOfProcessors;
178#elif defined __linux__
179    return (int)sysconf( _SC_NPROCESSORS_ONLN );
180#elif defined __APPLE__
181    int numCPU=0;
182    int mib[4];
183    size_t len = sizeof(numCPU);
184
185    // set the mib for hw.ncpu
186    mib[0] = CTL_HW;
187    mib[1] = HW_AVAILCPU;  // alternatively, try HW_NCPU;
188
189    // get the number of CPUs from the system
190    sysctl(mib, 2, &numCPU, &len, NULL, 0);
191
192    if( numCPU < 1 )
193    {
194        mib[1] = HW_NCPU;
195        sysctl( mib, 2, &numCPU, &len, NULL, 0 );
196
197        if( numCPU < 1 )
198            numCPU = 1;
199    }
200
201    return (int)numCPU;
202#else
203    return 1;
204#endif
205}
206
207
208struct Image_FFMPEG
209{
210    unsigned char* data;
211    int step;
212    int width;
213    int height;
214    int cn;
215};
216
217
218inline void _opencv_ffmpeg_free(void** ptr)
219{
220    if(*ptr) free(*ptr);
221    *ptr = 0;
222}
223
224
225struct CvCapture_FFMPEG
226{
227    bool open( const char* filename );
228    void close();
229
230    double getProperty(int) const;
231    bool setProperty(int, double);
232    bool grabFrame();
233    bool retrieveFrame(int, unsigned char** data, int* step, int* width, int* height, int* cn);
234
235    void init();
236
237    void    seek(int64_t frame_number);
238    void    seek(double sec);
239    bool    slowSeek( int framenumber );
240
241    int64_t get_total_frames() const;
242    double  get_duration_sec() const;
243    double  get_fps() const;
244    int     get_bitrate() const;
245
246    double  r2d(AVRational r) const;
247    int64_t dts_to_frame_number(int64_t dts);
248    double  dts_to_sec(int64_t dts);
249
250    AVFormatContext * ic;
251    AVCodec         * avcodec;
252    int               video_stream;
253    AVStream        * video_st;
254    AVFrame         * picture;
255    AVFrame           rgb_picture;
256    int64_t           picture_pts;
257
258    AVPacket          packet;
259    Image_FFMPEG      frame;
260    struct SwsContext *img_convert_ctx;
261
262    int64_t frame_number, first_frame_number;
263
264    double eps_zero;
265/*
266   'filename' contains the filename of the videosource,
267   'filename==NULL' indicates that ffmpeg's seek support works
268   for the particular file.
269   'filename!=NULL' indicates that the slow fallback function is used for seeking,
270   and so the filename is needed to reopen the file on backward seeking.
271*/
272    char              * filename;
273
274#if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(52, 111, 0)
275    AVDictionary *dict;
276#endif
277};
278
279void CvCapture_FFMPEG::init()
280{
281    ic = 0;
282    video_stream = -1;
283    video_st = 0;
284    picture = 0;
285    picture_pts = AV_NOPTS_VALUE_;
286    first_frame_number = -1;
287    memset( &rgb_picture, 0, sizeof(rgb_picture) );
288    memset( &frame, 0, sizeof(frame) );
289    filename = 0;
290    memset(&packet, 0, sizeof(packet));
291    av_init_packet(&packet);
292    img_convert_ctx = 0;
293
294    avcodec = 0;
295    frame_number = 0;
296    eps_zero = 0.000025;
297
298#if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(52, 111, 0)
299    dict = NULL;
300#endif
301}
302
303
304void CvCapture_FFMPEG::close()
305{
306    if( img_convert_ctx )
307    {
308        sws_freeContext(img_convert_ctx);
309        img_convert_ctx = 0;
310    }
311
312    if( picture )
313    {
314        // FFmpeg and Libav added avcodec_free_frame in different versions.
315#if LIBAVCODEC_BUILD >= (LIBAVCODEC_VERSION_MICRO >= 100 \
316    ? CALC_FFMPEG_VERSION(54, 59, 100) : CALC_FFMPEG_VERSION(54, 28, 0))
317        avcodec_free_frame(&picture);
318#else
319        av_free(picture);
320#endif
321    }
322
323    if( video_st )
324    {
325#if LIBAVFORMAT_BUILD > 4628
326        avcodec_close( video_st->codec );
327
328#else
329        avcodec_close( &(video_st->codec) );
330
331#endif
332        video_st = NULL;
333    }
334
335    if( ic )
336    {
337#if LIBAVFORMAT_BUILD < CALC_FFMPEG_VERSION(53, 24, 2)
338        av_close_input_file(ic);
339#else
340        avformat_close_input(&ic);
341#endif
342
343        ic = NULL;
344    }
345
346    if( rgb_picture.data[0] )
347    {
348        free( rgb_picture.data[0] );
349        rgb_picture.data[0] = 0;
350    }
351
352    // free last packet if exist
353    if (packet.data) {
354        av_free_packet (&packet);
355        packet.data = NULL;
356    }
357
358#if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(52, 111, 0)
359    if (dict != NULL)
360       av_dict_free(&dict);
361#endif
362
363    init();
364}
365
366
367#ifndef AVSEEK_FLAG_FRAME
368#define AVSEEK_FLAG_FRAME 0
369#endif
370#ifndef AVSEEK_FLAG_ANY
371#define AVSEEK_FLAG_ANY 1
372#endif
373
374class ImplMutex
375{
376public:
377    ImplMutex() { init(); }
378    ~ImplMutex() { destroy(); }
379
380    void init();
381    void destroy();
382
383    void lock();
384    bool trylock();
385    void unlock();
386
387    struct Impl;
388protected:
389    Impl* impl;
390
391private:
392    ImplMutex(const ImplMutex&);
393    ImplMutex& operator = (const ImplMutex& m);
394};
395
396#if defined WIN32 || defined _WIN32 || defined WINCE
397
398struct ImplMutex::Impl
399{
400    void init()
401    {
402#if (_WIN32_WINNT >= 0x0600)
403        ::InitializeCriticalSectionEx(&cs, 1000, 0);
404#else
405        ::InitializeCriticalSection(&cs);
406#endif
407        refcount = 1;
408    }
409    void destroy() { DeleteCriticalSection(&cs); }
410
411    void lock() { EnterCriticalSection(&cs); }
412    bool trylock() { return TryEnterCriticalSection(&cs) != 0; }
413    void unlock() { LeaveCriticalSection(&cs); }
414
415    CRITICAL_SECTION cs;
416    int refcount;
417};
418
419#ifndef __GNUC__
420static int _interlockedExchangeAdd(int* addr, int delta)
421{
422#if defined _MSC_VER && _MSC_VER >= 1500
423    return (int)_InterlockedExchangeAdd((long volatile*)addr, delta);
424#else
425    return (int)InterlockedExchangeAdd((long volatile*)addr, delta);
426#endif
427}
428#endif // __GNUC__
429
430#elif defined __APPLE__
431
432#include <libkern/OSAtomic.h>
433
434struct ImplMutex::Impl
435{
436    void init() { sl = OS_SPINLOCK_INIT; refcount = 1; }
437    void destroy() { }
438
439    void lock() { OSSpinLockLock(&sl); }
440    bool trylock() { return OSSpinLockTry(&sl); }
441    void unlock() { OSSpinLockUnlock(&sl); }
442
443    OSSpinLock sl;
444    int refcount;
445};
446
447#elif defined __linux__ && !defined ANDROID
448
449struct ImplMutex::Impl
450{
451    void init() { pthread_spin_init(&sl, 0); refcount = 1; }
452    void destroy() { pthread_spin_destroy(&sl); }
453
454    void lock() { pthread_spin_lock(&sl); }
455    bool trylock() { return pthread_spin_trylock(&sl) == 0; }
456    void unlock() { pthread_spin_unlock(&sl); }
457
458    pthread_spinlock_t sl;
459    int refcount;
460};
461
462#else
463
464struct ImplMutex::Impl
465{
466    void init() { pthread_mutex_init(&sl, 0); refcount = 1; }
467    void destroy() { pthread_mutex_destroy(&sl); }
468
469    void lock() { pthread_mutex_lock(&sl); }
470    bool trylock() { return pthread_mutex_trylock(&sl) == 0; }
471    void unlock() { pthread_mutex_unlock(&sl); }
472
473    pthread_mutex_t sl;
474    int refcount;
475};
476
477#endif
478
479void ImplMutex::init()
480{
481    impl = (Impl*)malloc(sizeof(Impl));
482    impl->init();
483}
484void ImplMutex::destroy()
485{
486    impl->destroy();
487    free(impl);
488    impl = NULL;
489}
490void ImplMutex::lock() { impl->lock(); }
491void ImplMutex::unlock() { impl->unlock(); }
492bool ImplMutex::trylock() { return impl->trylock(); }
493
494static int LockCallBack(void **mutex, AVLockOp op)
495{
496    ImplMutex* localMutex = reinterpret_cast<ImplMutex*>(*mutex);
497    switch (op)
498    {
499        case AV_LOCK_CREATE:
500            localMutex = reinterpret_cast<ImplMutex*>(malloc(sizeof(ImplMutex)));
501            localMutex->init();
502            *mutex = localMutex;
503            if (!*mutex)
504                return 1;
505        break;
506
507        case AV_LOCK_OBTAIN:
508            localMutex->lock();
509        break;
510
511        case AV_LOCK_RELEASE:
512            localMutex->unlock();
513        break;
514
515        case AV_LOCK_DESTROY:
516            localMutex->destroy();
517            free(localMutex);
518            localMutex = NULL;
519            *mutex = NULL;
520        break;
521    }
522    return 0;
523}
524
525static ImplMutex _mutex;
526static bool _initialized = false;
527
528class InternalFFMpegRegister
529{
530public:
531    InternalFFMpegRegister()
532    {
533        _mutex.lock();
534        if (!_initialized)
535        {
536    #if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(53, 13, 0)
537            avformat_network_init();
538    #endif
539
540            /* register all codecs, demux and protocols */
541            av_register_all();
542
543            /* register a callback function for synchronization */
544            av_lockmgr_register(&LockCallBack);
545
546            av_log_set_level(AV_LOG_ERROR);
547
548            _initialized = true;
549        }
550        _mutex.unlock();
551    }
552
553    ~InternalFFMpegRegister()
554    {
555        _initialized = false;
556        av_lockmgr_register(NULL);
557    }
558};
559
560static InternalFFMpegRegister _init;
561
562bool CvCapture_FFMPEG::open( const char* _filename )
563{
564    unsigned i;
565    bool valid = false;
566
567    close();
568
569#if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(52, 111, 0)
570    av_dict_set(&dict, "rtsp_transport", "tcp", 0);
571    int err = avformat_open_input(&ic, _filename, NULL, NULL);
572#else
573    int err = av_open_input_file(&ic, _filename, NULL, 0, NULL);
574#endif
575
576    if (err < 0)
577    {
578        CV_WARN("Error opening file");
579        goto exit_func;
580    }
581    err =
582#if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(53, 6, 0)
583    avformat_find_stream_info(ic, NULL);
584#else
585    av_find_stream_info(ic);
586#endif
587    if (err < 0)
588    {
589        CV_WARN("Could not find codec parameters");
590        goto exit_func;
591    }
592    for(i = 0; i < ic->nb_streams; i++)
593    {
594#if LIBAVFORMAT_BUILD > 4628
595        AVCodecContext *enc = ic->streams[i]->codec;
596#else
597        AVCodecContext *enc = &ic->streams[i]->codec;
598#endif
599
600//#ifdef FF_API_THREAD_INIT
601//        avcodec_thread_init(enc, get_number_of_cpus());
602//#else
603        enc->thread_count = get_number_of_cpus();
604//#endif
605
606#if LIBAVFORMAT_BUILD < CALC_FFMPEG_VERSION(53, 2, 0)
607#define AVMEDIA_TYPE_VIDEO CODEC_TYPE_VIDEO
608#endif
609
610        if( AVMEDIA_TYPE_VIDEO == enc->codec_type && video_stream < 0)
611        {
612            // backup encoder' width/height
613            int enc_width = enc->width;
614            int enc_height = enc->height;
615
616            AVCodec *codec = avcodec_find_decoder(enc->codec_id);
617            if (!codec ||
618#if LIBAVCODEC_VERSION_INT >= ((53<<16)+(8<<8)+0)
619                avcodec_open2(enc, codec, NULL)
620#else
621                avcodec_open(enc, codec)
622#endif
623                < 0)
624                goto exit_func;
625
626            // checking width/height (since decoder can sometimes alter it, eg. vp6f)
627            if (enc_width && (enc->width != enc_width)) { enc->width = enc_width; }
628            if (enc_height && (enc->height != enc_height)) { enc->height = enc_height; }
629
630            video_stream = i;
631            video_st = ic->streams[i];
632            picture = avcodec_alloc_frame();
633
634            rgb_picture.data[0] = (uint8_t*)malloc(
635                    avpicture_get_size( PIX_FMT_BGR24,
636                                        enc->width, enc->height ));
637            avpicture_fill( (AVPicture*)&rgb_picture, rgb_picture.data[0],
638                            PIX_FMT_BGR24, enc->width, enc->height );
639
640            frame.width = enc->width;
641            frame.height = enc->height;
642            frame.cn = 3;
643            frame.step = rgb_picture.linesize[0];
644            frame.data = rgb_picture.data[0];
645            break;
646        }
647    }
648
649    if(video_stream >= 0) valid = true;
650
651exit_func:
652
653    if( !valid )
654        close();
655
656    return valid;
657}
658
659
660bool CvCapture_FFMPEG::grabFrame()
661{
662    bool valid = false;
663    int got_picture;
664
665    int count_errs = 0;
666    const int max_number_of_attempts = 1 << 9;
667
668    if( !ic || !video_st )  return false;
669
670    if( ic->streams[video_stream]->nb_frames > 0 &&
671        frame_number > ic->streams[video_stream]->nb_frames )
672        return false;
673
674    picture_pts = AV_NOPTS_VALUE_;
675
676    // get the next frame
677    while (!valid)
678    {
679
680        av_free_packet (&packet);
681        int ret = av_read_frame(ic, &packet);
682        if (ret == AVERROR(EAGAIN)) continue;
683
684        /* else if (ret < 0) break; */
685
686        if( packet.stream_index != video_stream )
687        {
688            av_free_packet (&packet);
689            count_errs++;
690            if (count_errs > max_number_of_attempts)
691                break;
692            continue;
693        }
694
695        // Decode video frame
696        #if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(53, 2, 0)
697            avcodec_decode_video2(video_st->codec, picture, &got_picture, &packet);
698        #elif LIBAVFORMAT_BUILD > 4628
699                avcodec_decode_video(video_st->codec,
700                                     picture, &got_picture,
701                                     packet.data, packet.size);
702        #else
703                avcodec_decode_video(&video_st->codec,
704                                     picture, &got_picture,
705                                     packet.data, packet.size);
706        #endif
707
708        // Did we get a video frame?
709        if(got_picture)
710        {
711            //picture_pts = picture->best_effort_timestamp;
712            if( picture_pts == AV_NOPTS_VALUE_ )
713                picture_pts = packet.pts != AV_NOPTS_VALUE_ && packet.pts != 0 ? packet.pts : packet.dts;
714            frame_number++;
715            valid = true;
716        }
717        else
718        {
719            count_errs++;
720            if (count_errs > max_number_of_attempts)
721                break;
722        }
723    }
724
725    if( valid && first_frame_number < 0 )
726        first_frame_number = dts_to_frame_number(picture_pts);
727
728    // return if we have a new picture or not
729    return valid;
730}
731
732
733bool CvCapture_FFMPEG::retrieveFrame(int, unsigned char** data, int* step, int* width, int* height, int* cn)
734{
735    if( !video_st || !picture->data[0] )
736        return false;
737
738    avpicture_fill((AVPicture*)&rgb_picture, rgb_picture.data[0], PIX_FMT_RGB24,
739                   video_st->codec->width, video_st->codec->height);
740
741    if( img_convert_ctx == NULL ||
742        frame.width != video_st->codec->width ||
743        frame.height != video_st->codec->height )
744    {
745        if( img_convert_ctx )
746            sws_freeContext(img_convert_ctx);
747
748        frame.width = video_st->codec->width;
749        frame.height = video_st->codec->height;
750
751        img_convert_ctx = sws_getCachedContext(
752                NULL,
753                video_st->codec->width, video_st->codec->height,
754                video_st->codec->pix_fmt,
755                video_st->codec->width, video_st->codec->height,
756                PIX_FMT_BGR24,
757                SWS_BICUBIC,
758                NULL, NULL, NULL
759                );
760
761        if (img_convert_ctx == NULL)
762            return false;//CV_Error(0, "Cannot initialize the conversion context!");
763    }
764
765    sws_scale(
766            img_convert_ctx,
767            picture->data,
768            picture->linesize,
769            0, video_st->codec->height,
770            rgb_picture.data,
771            rgb_picture.linesize
772            );
773
774    *data = frame.data;
775    *step = frame.step;
776    *width = frame.width;
777    *height = frame.height;
778    *cn = frame.cn;
779
780    return true;
781}
782
783
784double CvCapture_FFMPEG::getProperty( int property_id ) const
785{
786    if( !video_st ) return 0;
787
788    switch( property_id )
789    {
790    case CV_FFMPEG_CAP_PROP_POS_MSEC:
791        return 1000.0*(double)frame_number/get_fps();
792    case CV_FFMPEG_CAP_PROP_POS_FRAMES:
793        return (double)frame_number;
794    case CV_FFMPEG_CAP_PROP_POS_AVI_RATIO:
795        return r2d(ic->streams[video_stream]->time_base);
796    case CV_FFMPEG_CAP_PROP_FRAME_COUNT:
797        return (double)get_total_frames();
798    case CV_FFMPEG_CAP_PROP_FRAME_WIDTH:
799        return (double)frame.width;
800    case CV_FFMPEG_CAP_PROP_FRAME_HEIGHT:
801        return (double)frame.height;
802    case CV_FFMPEG_CAP_PROP_FPS:
803#if LIBAVCODEC_BUILD >= CALC_FFMPEG_VERSION(54, 1, 0)
804        return av_q2d(video_st->avg_frame_rate);
805#elif LIBAVCODEC_BUILD > 4753
806        return av_q2d(video_st->r_frame_rate);
807#else
808        return (double)video_st->codec.frame_rate
809                / (double)video_st->codec.frame_rate_base;
810#endif
811    case CV_FFMPEG_CAP_PROP_FOURCC:
812#if LIBAVFORMAT_BUILD > 4628
813        return (double)video_st->codec->codec_tag;
814#else
815        return (double)video_st->codec.codec_tag;
816#endif
817    default:
818        break;
819    }
820
821    return 0;
822}
823
824double CvCapture_FFMPEG::r2d(AVRational r) const
825{
826    return r.num == 0 || r.den == 0 ? 0. : (double)r.num / (double)r.den;
827}
828
829double CvCapture_FFMPEG::get_duration_sec() const
830{
831    double sec = (double)ic->duration / (double)AV_TIME_BASE;
832
833    if (sec < eps_zero)
834    {
835        sec = (double)ic->streams[video_stream]->duration * r2d(ic->streams[video_stream]->time_base);
836    }
837
838    if (sec < eps_zero)
839    {
840        sec = (double)ic->streams[video_stream]->duration * r2d(ic->streams[video_stream]->time_base);
841    }
842
843    return sec;
844}
845
846int CvCapture_FFMPEG::get_bitrate() const
847{
848    return ic->bit_rate;
849}
850
851double CvCapture_FFMPEG::get_fps() const
852{
853#if LIBAVCODEC_BUILD >= CALC_FFMPEG_VERSION(54, 1, 0)
854    double fps = r2d(ic->streams[video_stream]->avg_frame_rate);
855#else
856    double fps = r2d(ic->streams[video_stream]->r_frame_rate);
857#endif
858
859#if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(52, 111, 0)
860    if (fps < eps_zero)
861    {
862        fps = r2d(ic->streams[video_stream]->avg_frame_rate);
863    }
864#endif
865
866    if (fps < eps_zero)
867    {
868        fps = 1.0 / r2d(ic->streams[video_stream]->codec->time_base);
869    }
870
871    return fps;
872}
873
874int64_t CvCapture_FFMPEG::get_total_frames() const
875{
876    int64_t nbf = ic->streams[video_stream]->nb_frames;
877
878    if (nbf == 0)
879    {
880        nbf = (int64_t)floor(get_duration_sec() * get_fps() + 0.5);
881    }
882    return nbf;
883}
884
885int64_t CvCapture_FFMPEG::dts_to_frame_number(int64_t dts)
886{
887    double sec = dts_to_sec(dts);
888    return (int64_t)(get_fps() * sec + 0.5);
889}
890
891double CvCapture_FFMPEG::dts_to_sec(int64_t dts)
892{
893    return (double)(dts - ic->streams[video_stream]->start_time) *
894        r2d(ic->streams[video_stream]->time_base);
895}
896
897void CvCapture_FFMPEG::seek(int64_t _frame_number)
898{
899    _frame_number = std::min(_frame_number, get_total_frames());
900    int delta = 16;
901
902    // if we have not grabbed a single frame before first seek, let's read the first frame
903    // and get some valuable information during the process
904    if( first_frame_number < 0 && get_total_frames() > 1 )
905        grabFrame();
906
907    for(;;)
908    {
909        int64_t _frame_number_temp = std::max(_frame_number-delta, (int64_t)0);
910        double sec = (double)_frame_number_temp / get_fps();
911        int64_t time_stamp = ic->streams[video_stream]->start_time;
912        double  time_base  = r2d(ic->streams[video_stream]->time_base);
913        time_stamp += (int64_t)(sec / time_base + 0.5);
914        if (get_total_frames() > 1) av_seek_frame(ic, video_stream, time_stamp, AVSEEK_FLAG_BACKWARD);
915        avcodec_flush_buffers(ic->streams[video_stream]->codec);
916        if( _frame_number > 0 )
917        {
918            grabFrame();
919
920            if( _frame_number > 1 )
921            {
922                frame_number = dts_to_frame_number(picture_pts) - first_frame_number;
923                //printf("_frame_number = %d, frame_number = %d, delta = %d\n",
924                //       (int)_frame_number, (int)frame_number, delta);
925
926                if( frame_number < 0 || frame_number > _frame_number-1 )
927                {
928                    if( _frame_number_temp == 0 || delta >= INT_MAX/4 )
929                        break;
930                    delta = delta < 16 ? delta*2 : delta*3/2;
931                    continue;
932                }
933                while( frame_number < _frame_number-1 )
934                {
935                    if(!grabFrame())
936                        break;
937                }
938                frame_number++;
939                break;
940            }
941            else
942            {
943                frame_number = 1;
944                break;
945            }
946        }
947        else
948        {
949            frame_number = 0;
950            break;
951        }
952    }
953}
954
955void CvCapture_FFMPEG::seek(double sec)
956{
957    seek((int64_t)(sec * get_fps() + 0.5));
958}
959
960bool CvCapture_FFMPEG::setProperty( int property_id, double value )
961{
962    if( !video_st ) return false;
963
964    switch( property_id )
965    {
966    case CV_FFMPEG_CAP_PROP_POS_MSEC:
967    case CV_FFMPEG_CAP_PROP_POS_FRAMES:
968    case CV_FFMPEG_CAP_PROP_POS_AVI_RATIO:
969        {
970            switch( property_id )
971            {
972            case CV_FFMPEG_CAP_PROP_POS_FRAMES:
973                seek((int64_t)value);
974                break;
975
976            case CV_FFMPEG_CAP_PROP_POS_MSEC:
977                seek(value/1000.0);
978                break;
979
980            case CV_FFMPEG_CAP_PROP_POS_AVI_RATIO:
981                seek((int64_t)(value*ic->duration));
982                break;
983            }
984
985            picture_pts=(int64_t)value;
986        }
987        break;
988    default:
989        return false;
990    }
991
992    return true;
993}
994
995
996///////////////// FFMPEG CvVideoWriter implementation //////////////////////////
997struct CvVideoWriter_FFMPEG
998{
999    bool open( const char* filename, int fourcc,
1000               double fps, int width, int height, bool isColor );
1001    void close();
1002    bool writeFrame( const unsigned char* data, int step, int width, int height, int cn, int origin );
1003
1004    void init();
1005
1006    AVOutputFormat  * fmt;
1007    AVFormatContext * oc;
1008    uint8_t         * outbuf;
1009    uint32_t          outbuf_size;
1010    FILE            * outfile;
1011    AVFrame         * picture;
1012    AVFrame         * input_picture;
1013    uint8_t         * picbuf;
1014    AVStream        * video_st;
1015    int               input_pix_fmt;
1016    Image_FFMPEG      temp_image;
1017    int               frame_width, frame_height;
1018    int               frame_idx;
1019    bool              ok;
1020    struct SwsContext *img_convert_ctx;
1021};
1022
1023static const char * icvFFMPEGErrStr(int err)
1024{
1025#if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(53, 2, 0)
1026    switch(err) {
1027    case AVERROR_BSF_NOT_FOUND:
1028        return "Bitstream filter not found";
1029    case AVERROR_DECODER_NOT_FOUND:
1030        return "Decoder not found";
1031    case AVERROR_DEMUXER_NOT_FOUND:
1032        return "Demuxer not found";
1033    case AVERROR_ENCODER_NOT_FOUND:
1034        return "Encoder not found";
1035    case AVERROR_EOF:
1036        return "End of file";
1037    case AVERROR_EXIT:
1038        return "Immediate exit was requested; the called function should not be restarted";
1039    case AVERROR_FILTER_NOT_FOUND:
1040        return "Filter not found";
1041    case AVERROR_INVALIDDATA:
1042        return "Invalid data found when processing input";
1043    case AVERROR_MUXER_NOT_FOUND:
1044        return "Muxer not found";
1045    case AVERROR_OPTION_NOT_FOUND:
1046        return "Option not found";
1047    case AVERROR_PATCHWELCOME:
1048        return "Not yet implemented in FFmpeg, patches welcome";
1049    case AVERROR_PROTOCOL_NOT_FOUND:
1050        return "Protocol not found";
1051    case AVERROR_STREAM_NOT_FOUND:
1052        return "Stream not found";
1053    default:
1054        break;
1055    }
1056#else
1057    switch(err) {
1058    case AVERROR_NUMEXPECTED:
1059        return "Incorrect filename syntax";
1060    case AVERROR_INVALIDDATA:
1061        return "Invalid data in header";
1062    case AVERROR_NOFMT:
1063        return "Unknown format";
1064    case AVERROR_IO:
1065        return "I/O error occurred";
1066    case AVERROR_NOMEM:
1067        return "Memory allocation error";
1068    default:
1069        break;
1070    }
1071#endif
1072
1073    return "Unspecified error";
1074}
1075
1076/* function internal to FFMPEG (libavformat/riff.c) to lookup codec id by fourcc tag*/
1077extern "C" {
1078    enum CV_CODEC_ID codec_get_bmp_id(unsigned int tag);
1079}
1080
1081void CvVideoWriter_FFMPEG::init()
1082{
1083    fmt = 0;
1084    oc = 0;
1085    outbuf = 0;
1086    outbuf_size = 0;
1087    outfile = 0;
1088    picture = 0;
1089    input_picture = 0;
1090    picbuf = 0;
1091    video_st = 0;
1092    input_pix_fmt = 0;
1093    memset(&temp_image, 0, sizeof(temp_image));
1094    img_convert_ctx = 0;
1095    frame_width = frame_height = 0;
1096    frame_idx = 0;
1097    ok = false;
1098}
1099
1100/**
1101 * the following function is a modified version of code
1102 * found in ffmpeg-0.4.9-pre1/output_example.c
1103 */
1104static AVFrame * icv_alloc_picture_FFMPEG(int pix_fmt, int width, int height, bool alloc)
1105{
1106    AVFrame * picture;
1107    uint8_t * picture_buf;
1108    int size;
1109
1110    picture = avcodec_alloc_frame();
1111    if (!picture)
1112        return NULL;
1113    size = avpicture_get_size( (PixelFormat) pix_fmt, width, height);
1114    if(alloc){
1115        picture_buf = (uint8_t *) malloc(size);
1116        if (!picture_buf)
1117        {
1118            av_free(picture);
1119            return NULL;
1120        }
1121        avpicture_fill((AVPicture *)picture, picture_buf,
1122                       (PixelFormat) pix_fmt, width, height);
1123    }
1124    else {
1125    }
1126    return picture;
1127}
1128
1129/* add a video output stream to the container */
1130static AVStream *icv_add_video_stream_FFMPEG(AVFormatContext *oc,
1131                                             CV_CODEC_ID codec_id,
1132                                             int w, int h, int bitrate,
1133                                             double fps, int pixel_format)
1134{
1135    AVCodecContext *c;
1136    AVStream *st;
1137    int frame_rate, frame_rate_base;
1138    AVCodec *codec;
1139
1140#if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(53, 10, 0)
1141    st = avformat_new_stream(oc, 0);
1142#else
1143    st = av_new_stream(oc, 0);
1144#endif
1145
1146    if (!st) {
1147        CV_WARN("Could not allocate stream");
1148        return NULL;
1149    }
1150
1151#if LIBAVFORMAT_BUILD > 4628
1152    c = st->codec;
1153#else
1154    c = &(st->codec);
1155#endif
1156
1157#if LIBAVFORMAT_BUILD > 4621
1158    c->codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_VIDEO);
1159#else
1160    c->codec_id = oc->oformat->video_codec;
1161#endif
1162
1163    if(codec_id != CV_CODEC(CODEC_ID_NONE)){
1164        c->codec_id = codec_id;
1165    }
1166
1167    //if(codec_tag) c->codec_tag=codec_tag;
1168    codec = avcodec_find_encoder(c->codec_id);
1169
1170    c->codec_type = AVMEDIA_TYPE_VIDEO;
1171
1172#if LIBAVCODEC_BUILD >= CALC_FFMPEG_VERSION(54,25,0)
1173    // Set per-codec defaults
1174    AVCodecID c_id = c->codec_id;
1175    avcodec_get_context_defaults3(c, codec);
1176    // avcodec_get_context_defaults3 erases codec_id for some reason
1177    c->codec_id = c_id;
1178#endif
1179
1180    /* put sample parameters */
1181    int64_t lbit_rate = (int64_t)bitrate;
1182    lbit_rate += (bitrate / 2);
1183    lbit_rate = std::min(lbit_rate, (int64_t)INT_MAX);
1184    c->bit_rate = lbit_rate;
1185
1186    // took advice from
1187    // http://ffmpeg-users.933282.n4.nabble.com/warning-clipping-1-dct-coefficients-to-127-127-td934297.html
1188    c->qmin = 3;
1189
1190    /* resolution must be a multiple of two */
1191    c->width = w;
1192    c->height = h;
1193
1194    /* time base: this is the fundamental unit of time (in seconds) in terms
1195       of which frame timestamps are represented. for fixed-fps content,
1196       timebase should be 1/framerate and timestamp increments should be
1197       identically 1. */
1198    frame_rate=(int)(fps+0.5);
1199    frame_rate_base=1;
1200    while (fabs((double)frame_rate/frame_rate_base) - fps > 0.001){
1201        frame_rate_base*=10;
1202        frame_rate=(int)(fps*frame_rate_base + 0.5);
1203    }
1204#if LIBAVFORMAT_BUILD > 4752
1205    c->time_base.den = frame_rate;
1206    c->time_base.num = frame_rate_base;
1207    /* adjust time base for supported framerates */
1208    if(codec && codec->supported_framerates){
1209        const AVRational *p= codec->supported_framerates;
1210        AVRational req = {frame_rate, frame_rate_base};
1211        const AVRational *best=NULL;
1212        AVRational best_error= {INT_MAX, 1};
1213        for(; p->den!=0; p++){
1214            AVRational error= av_sub_q(req, *p);
1215            if(error.num <0) error.num *= -1;
1216            if(av_cmp_q(error, best_error) < 0){
1217                best_error= error;
1218                best= p;
1219            }
1220        }
1221        c->time_base.den= best->num;
1222        c->time_base.num= best->den;
1223    }
1224#else
1225    c->frame_rate = frame_rate;
1226    c->frame_rate_base = frame_rate_base;
1227#endif
1228
1229    c->gop_size = 12; /* emit one intra frame every twelve frames at most */
1230    c->pix_fmt = (PixelFormat) pixel_format;
1231
1232    if (c->codec_id == CV_CODEC(CODEC_ID_MPEG2VIDEO)) {
1233        c->max_b_frames = 2;
1234    }
1235    if (c->codec_id == CV_CODEC(CODEC_ID_MPEG1VIDEO) || c->codec_id == CV_CODEC(CODEC_ID_MSMPEG4V3)){
1236        /* needed to avoid using macroblocks in which some coeffs overflow
1237           this doesnt happen with normal video, it just happens here as the
1238           motion of the chroma plane doesnt match the luma plane */
1239        /* avoid FFMPEG warning 'clipping 1 dct coefficients...' */
1240        c->mb_decision=2;
1241    }
1242
1243#if LIBAVUTIL_BUILD > CALC_FFMPEG_VERSION(51,11,0)
1244    /* Some settings for libx264 encoding, restore dummy values for gop_size
1245     and qmin since they will be set to reasonable defaults by the libx264
1246     preset system. Also, use a crf encode with the default quality rating,
1247     this seems easier than finding an appropriate default bitrate. */
1248    if (c->codec_id == AV_CODEC_ID_H264) {
1249      c->gop_size = -1;
1250      c->qmin = -1;
1251      c->bit_rate = 0;
1252      av_opt_set(c->priv_data,"crf","23", 0);
1253    }
1254#endif
1255
1256#if LIBAVCODEC_VERSION_INT>0x000409
1257    // some formats want stream headers to be seperate
1258    if(oc->oformat->flags & AVFMT_GLOBALHEADER)
1259    {
1260        c->flags |= CODEC_FLAG_GLOBAL_HEADER;
1261    }
1262#endif
1263
1264    return st;
1265}
1266
1267static const int OPENCV_NO_FRAMES_WRITTEN_CODE = 1000;
1268
1269static int icv_av_write_frame_FFMPEG( AVFormatContext * oc, AVStream * video_st,
1270#if LIBAVCODEC_BUILD >= CALC_FFMPEG_VERSION(54, 1, 0)
1271                                      uint8_t *, uint32_t,
1272#else
1273                                      uint8_t * outbuf, uint32_t outbuf_size,
1274#endif
1275                                      AVFrame * picture )
1276{
1277#if LIBAVFORMAT_BUILD > 4628
1278    AVCodecContext * c = video_st->codec;
1279#else
1280    AVCodecContext * c = &(video_st->codec);
1281#endif
1282    int ret = OPENCV_NO_FRAMES_WRITTEN_CODE;
1283
1284    if (oc->oformat->flags & AVFMT_RAWPICTURE) {
1285        /* raw video case. The API will change slightly in the near
1286           futur for that */
1287        AVPacket pkt;
1288        av_init_packet(&pkt);
1289
1290#ifndef PKT_FLAG_KEY
1291#define PKT_FLAG_KEY AV_PKT_FLAG_KEY
1292#endif
1293
1294        pkt.flags |= PKT_FLAG_KEY;
1295        pkt.stream_index= video_st->index;
1296        pkt.data= (uint8_t *)picture;
1297        pkt.size= sizeof(AVPicture);
1298
1299        ret = av_write_frame(oc, &pkt);
1300    } else {
1301        /* encode the image */
1302        AVPacket pkt;
1303        av_init_packet(&pkt);
1304#if LIBAVCODEC_BUILD >= CALC_FFMPEG_VERSION(54, 1, 0)
1305        int got_output = 0;
1306        pkt.data = NULL;
1307        pkt.size = 0;
1308        ret = avcodec_encode_video2(c, &pkt, picture, &got_output);
1309        if (ret < 0)
1310            ;
1311        else if (got_output) {
1312            if (pkt.pts != (int64_t)AV_NOPTS_VALUE)
1313                pkt.pts = av_rescale_q(pkt.pts, c->time_base, video_st->time_base);
1314            if (pkt.dts != (int64_t)AV_NOPTS_VALUE)
1315                pkt.dts = av_rescale_q(pkt.dts, c->time_base, video_st->time_base);
1316            if (pkt.duration)
1317                pkt.duration = av_rescale_q(pkt.duration, c->time_base, video_st->time_base);
1318            pkt.stream_index= video_st->index;
1319            ret = av_write_frame(oc, &pkt);
1320            av_free_packet(&pkt);
1321        }
1322        else
1323            ret = OPENCV_NO_FRAMES_WRITTEN_CODE;
1324#else
1325        int out_size = avcodec_encode_video(c, outbuf, outbuf_size, picture);
1326        /* if zero size, it means the image was buffered */
1327        if (out_size > 0) {
1328#if LIBAVFORMAT_BUILD > 4752
1329            if(c->coded_frame->pts != (int64_t)AV_NOPTS_VALUE)
1330                pkt.pts = av_rescale_q(c->coded_frame->pts, c->time_base, video_st->time_base);
1331#else
1332            pkt.pts = c->coded_frame->pts;
1333#endif
1334            if(c->coded_frame->key_frame)
1335                pkt.flags |= PKT_FLAG_KEY;
1336            pkt.stream_index= video_st->index;
1337            pkt.data= outbuf;
1338            pkt.size= out_size;
1339
1340            /* write the compressed frame in the media file */
1341            ret = av_write_frame(oc, &pkt);
1342        }
1343#endif
1344    }
1345    return ret;
1346}
1347
1348/// write a frame with FFMPEG
1349bool CvVideoWriter_FFMPEG::writeFrame( const unsigned char* data, int step, int width, int height, int cn, int origin )
1350{
1351    bool ret = false;
1352
1353    if( (width & -2) != frame_width || (height & -2) != frame_height || !data )
1354        return false;
1355    width = frame_width;
1356    height = frame_height;
1357
1358    // typecast from opaque data type to implemented struct
1359#if LIBAVFORMAT_BUILD > 4628
1360    AVCodecContext *c = video_st->codec;
1361#else
1362    AVCodecContext *c = &(video_st->codec);
1363#endif
1364
1365#if LIBAVFORMAT_BUILD < 5231
1366    // It is not needed in the latest versions of the ffmpeg
1367    if( c->codec_id == CV_CODEC(CODEC_ID_RAWVIDEO) && origin != 1 )
1368    {
1369        if( !temp_image.data )
1370        {
1371            temp_image.step = (width*cn + 3) & -4;
1372            temp_image.width = width;
1373            temp_image.height = height;
1374            temp_image.cn = cn;
1375            temp_image.data = (unsigned char*)malloc(temp_image.step*temp_image.height);
1376        }
1377        for( int y = 0; y < height; y++ )
1378            memcpy(temp_image.data + y*temp_image.step, data + (height-1-y)*step, width*cn);
1379        data = temp_image.data;
1380        step = temp_image.step;
1381    }
1382#else
1383    if( width*cn != step )
1384    {
1385        if( !temp_image.data )
1386        {
1387            temp_image.step = width*cn;
1388            temp_image.width = width;
1389            temp_image.height = height;
1390            temp_image.cn = cn;
1391            temp_image.data = (unsigned char*)malloc(temp_image.step*temp_image.height);
1392        }
1393        if (origin == 1)
1394            for( int y = 0; y < height; y++ )
1395                memcpy(temp_image.data + y*temp_image.step, data + (height-1-y)*step, temp_image.step);
1396        else
1397            for( int y = 0; y < height; y++ )
1398                memcpy(temp_image.data + y*temp_image.step, data + y*step, temp_image.step);
1399        data = temp_image.data;
1400        step = temp_image.step;
1401    }
1402#endif
1403
1404    // check parameters
1405    if (input_pix_fmt == PIX_FMT_BGR24) {
1406        if (cn != 3) {
1407            return false;
1408        }
1409    }
1410    else if (input_pix_fmt == PIX_FMT_GRAY8) {
1411        if (cn != 1) {
1412            return false;
1413        }
1414    }
1415    else {
1416        assert(false);
1417    }
1418
1419    if ( c->pix_fmt != input_pix_fmt ) {
1420        assert( input_picture );
1421        // let input_picture point to the raw data buffer of 'image'
1422        avpicture_fill((AVPicture *)input_picture, (uint8_t *) data,
1423                       (PixelFormat)input_pix_fmt, width, height);
1424
1425        if( !img_convert_ctx )
1426        {
1427            img_convert_ctx = sws_getContext(width,
1428                                             height,
1429                                             (PixelFormat)input_pix_fmt,
1430                                             c->width,
1431                                             c->height,
1432                                             c->pix_fmt,
1433                                             SWS_BICUBIC,
1434                                             NULL, NULL, NULL);
1435            if( !img_convert_ctx )
1436                return false;
1437        }
1438
1439        if ( sws_scale(img_convert_ctx, input_picture->data,
1440                       input_picture->linesize, 0,
1441                       height,
1442                       picture->data, picture->linesize) < 0 )
1443            return false;
1444    }
1445    else{
1446        avpicture_fill((AVPicture *)picture, (uint8_t *) data,
1447                       (PixelFormat)input_pix_fmt, width, height);
1448    }
1449
1450    picture->pts = frame_idx;
1451    ret = icv_av_write_frame_FFMPEG( oc, video_st, outbuf, outbuf_size, picture) >= 0;
1452    frame_idx++;
1453
1454    return ret;
1455}
1456
1457/// close video output stream and free associated memory
1458void CvVideoWriter_FFMPEG::close()
1459{
1460    // nothing to do if already released
1461    if ( !picture )
1462        return;
1463
1464    /* no more frame to compress. The codec has a latency of a few
1465       frames if using B frames, so we get the last frames by
1466       passing the same picture again */
1467    // TODO -- do we need to account for latency here?
1468
1469    /* write the trailer, if any */
1470    if(ok && oc)
1471    {
1472        if( (oc->oformat->flags & AVFMT_RAWPICTURE) == 0 )
1473        {
1474            for(;;)
1475            {
1476                int ret = icv_av_write_frame_FFMPEG( oc, video_st, outbuf, outbuf_size, NULL);
1477                if( ret == OPENCV_NO_FRAMES_WRITTEN_CODE || ret < 0 )
1478                    break;
1479            }
1480        }
1481        av_write_trailer(oc);
1482    }
1483
1484    if( img_convert_ctx )
1485    {
1486        sws_freeContext(img_convert_ctx);
1487        img_convert_ctx = 0;
1488    }
1489
1490    // free pictures
1491#if LIBAVFORMAT_BUILD > 4628
1492    if( video_st->codec->pix_fmt != input_pix_fmt)
1493#else
1494    if( video_st->codec.pix_fmt != input_pix_fmt)
1495#endif
1496    {
1497        if(picture->data[0])
1498            free(picture->data[0]);
1499        picture->data[0] = 0;
1500    }
1501    av_free(picture);
1502
1503    if (input_picture)
1504        av_free(input_picture);
1505
1506    /* close codec */
1507#if LIBAVFORMAT_BUILD > 4628
1508    avcodec_close(video_st->codec);
1509#else
1510    avcodec_close(&(video_st->codec));
1511#endif
1512
1513    av_free(outbuf);
1514
1515    if (!(fmt->flags & AVFMT_NOFILE))
1516    {
1517        /* close the output file */
1518
1519#if LIBAVCODEC_VERSION_INT < ((52<<16)+(123<<8)+0)
1520#if LIBAVCODEC_VERSION_INT >= ((51<<16)+(49<<8)+0)
1521        url_fclose(oc->pb);
1522#else
1523        url_fclose(&oc->pb);
1524#endif
1525#else
1526        avio_close(oc->pb);
1527#endif
1528
1529    }
1530
1531    /* free the stream */
1532    avformat_free_context(oc);
1533
1534    if( temp_image.data )
1535    {
1536        free(temp_image.data);
1537        temp_image.data = 0;
1538    }
1539
1540    init();
1541}
1542
1543#define CV_PRINTABLE_CHAR(ch) ((ch) < 32 ? '?' : (ch))
1544#define CV_TAG_TO_PRINTABLE_CHAR4(tag) CV_PRINTABLE_CHAR((tag) & 255), CV_PRINTABLE_CHAR(((tag) >> 8) & 255), CV_PRINTABLE_CHAR(((tag) >> 16) & 255), CV_PRINTABLE_CHAR(((tag) >> 24) & 255)
1545
1546static inline bool cv_ff_codec_tag_match(const AVCodecTag *tags, enum AVCodecID id, unsigned int tag)
1547{
1548    while (tags->id != AV_CODEC_ID_NONE)
1549    {
1550        if (tags->id == id && tags->tag == tag)
1551            return true;
1552        tags++;
1553    }
1554    return false;
1555}
1556static inline bool cv_ff_codec_tag_list_match(const AVCodecTag *const *tags, enum AVCodecID id, unsigned int tag)
1557{
1558    int i;
1559    for (i = 0; tags && tags[i]; i++) {
1560        bool res = cv_ff_codec_tag_match(tags[i], id, tag);
1561        if (res)
1562            return res;
1563    }
1564    return false;
1565}
1566
1567/// Create a video writer object that uses FFMPEG
1568bool CvVideoWriter_FFMPEG::open( const char * filename, int fourcc,
1569                                 double fps, int width, int height, bool is_color )
1570{
1571    CV_CODEC_ID codec_id = CV_CODEC(CODEC_ID_NONE);
1572    int err, codec_pix_fmt;
1573    double bitrate_scale = 1;
1574
1575    close();
1576
1577    // check arguments
1578    if( !filename )
1579        return false;
1580    if(fps <= 0)
1581        return false;
1582
1583    // we allow frames of odd width or height, but in this case we truncate
1584    // the rightmost column/the bottom row. Probably, this should be handled more elegantly,
1585    // but some internal functions inside FFMPEG swscale require even width/height.
1586    width &= -2;
1587    height &= -2;
1588    if( width <= 0 || height <= 0 )
1589        return false;
1590
1591    /* auto detect the output format from the name and fourcc code. */
1592
1593#if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(53, 2, 0)
1594    fmt = av_guess_format(NULL, filename, NULL);
1595#else
1596    fmt = guess_format(NULL, filename, NULL);
1597#endif
1598
1599    if (!fmt)
1600        return false;
1601
1602    /* determine optimal pixel format */
1603    if (is_color) {
1604        input_pix_fmt = PIX_FMT_BGR24;
1605    }
1606    else {
1607        input_pix_fmt = PIX_FMT_GRAY8;
1608    }
1609
1610    /* Lookup codec_id for given fourcc */
1611#if LIBAVCODEC_VERSION_INT<((51<<16)+(49<<8)+0)
1612    if( (codec_id = codec_get_bmp_id( fourcc )) == CV_CODEC(CODEC_ID_NONE) )
1613        return false;
1614#elif LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(54, 1, 0)
1615// APIchnages:
1616// 2012-01-31 - dd6d3b0 - lavf 54.01.0
1617//   Add avformat_get_riff_video_tags() and avformat_get_riff_audio_tags().
1618    if( (codec_id = av_codec_get_id(fmt->codec_tag, fourcc)) == CV_CODEC(CODEC_ID_NONE) )
1619    {
1620        const struct AVCodecTag * fallback_tags[] = {
1621                avformat_get_riff_video_tags(),
1622#if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(55, 25, 100)
1623// APIchanges: ffmpeg only
1624// 2014-01-19 - 1a193c4 - lavf 55.25.100 - avformat.h
1625//   Add avformat_get_mov_video_tags() and avformat_get_mov_audio_tags().
1626                // TODO ffmpeg only, need to skip libav: avformat_get_mov_video_tags(),
1627#endif
1628                codec_bmp_tags, NULL };
1629        if( (codec_id = av_codec_get_id(fallback_tags, fourcc)) == CV_CODEC(CODEC_ID_NONE) )
1630        {
1631            fflush(stdout);
1632            fprintf(stderr, "OpenCV: FFMPEG: tag 0x%08x/'%c%c%c%c' is not found (format '%s / %s')'\n",
1633                    fourcc, CV_TAG_TO_PRINTABLE_CHAR4(fourcc),
1634                    fmt->name, fmt->long_name);
1635            return false;
1636        }
1637    }
1638    // validate tag
1639    if (cv_ff_codec_tag_list_match(fmt->codec_tag, codec_id, fourcc) == false)
1640    {
1641        fflush(stdout);
1642        fprintf(stderr, "OpenCV: FFMPEG: tag 0x%08x/'%c%c%c%c' is not supported with codec id %d and format '%s / %s'\n",
1643                fourcc, CV_TAG_TO_PRINTABLE_CHAR4(fourcc),
1644                codec_id, fmt->name, fmt->long_name);
1645        int supported_tag;
1646        if( (supported_tag = av_codec_get_tag(fmt->codec_tag, codec_id)) != 0 )
1647        {
1648            fprintf(stderr, "OpenCV: FFMPEG: fallback to use tag 0x%08x/'%c%c%c%c'\n",
1649                    supported_tag, CV_TAG_TO_PRINTABLE_CHAR4(supported_tag));
1650            fourcc = supported_tag;
1651        }
1652    }
1653#else
1654    const struct AVCodecTag * tags[] = { codec_bmp_tags, NULL};
1655    if( (codec_id = av_codec_get_id(tags, fourcc)) == CV_CODEC(CODEC_ID_NONE) )
1656        return false;
1657#endif
1658
1659    // alloc memory for context
1660#if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(53, 2, 0)
1661    oc = avformat_alloc_context();
1662#else
1663    oc = av_alloc_format_context();
1664#endif
1665    assert (oc);
1666
1667    /* set file name */
1668    oc->oformat = fmt;
1669    snprintf(oc->filename, sizeof(oc->filename), "%s", filename);
1670
1671    /* set some options */
1672    oc->max_delay = (int)(0.7*AV_TIME_BASE);  /* This reduces buffer underrun warnings with MPEG */
1673
1674    // set a few optimal pixel formats for lossless codecs of interest..
1675    switch (codec_id) {
1676#if LIBAVCODEC_VERSION_INT>((50<<16)+(1<<8)+0)
1677    case CV_CODEC(CODEC_ID_JPEGLS):
1678        // BGR24 or GRAY8 depending on is_color...
1679        codec_pix_fmt = input_pix_fmt;
1680        break;
1681#endif
1682    case CV_CODEC(CODEC_ID_HUFFYUV):
1683        codec_pix_fmt = PIX_FMT_YUV422P;
1684        break;
1685    case CV_CODEC(CODEC_ID_MJPEG):
1686    case CV_CODEC(CODEC_ID_LJPEG):
1687        codec_pix_fmt = PIX_FMT_YUVJ420P;
1688        bitrate_scale = 3;
1689        break;
1690    case CV_CODEC(CODEC_ID_RAWVIDEO):
1691        codec_pix_fmt = input_pix_fmt == PIX_FMT_GRAY8 ||
1692                        input_pix_fmt == PIX_FMT_GRAY16LE ||
1693                        input_pix_fmt == PIX_FMT_GRAY16BE ? input_pix_fmt : PIX_FMT_YUV420P;
1694        break;
1695    default:
1696        // good for lossy formats, MPEG, etc.
1697        codec_pix_fmt = PIX_FMT_YUV420P;
1698        break;
1699    }
1700
1701    double bitrate = MIN(bitrate_scale*fps*width*height, (double)INT_MAX/2);
1702
1703    // TODO -- safe to ignore output audio stream?
1704    video_st = icv_add_video_stream_FFMPEG(oc, codec_id,
1705                                           width, height, (int)(bitrate + 0.5),
1706                                           fps, codec_pix_fmt);
1707
1708    /* set the output parameters (must be done even if no
1709   parameters). */
1710#if LIBAVFORMAT_BUILD < CALC_FFMPEG_VERSION(53, 2, 0)
1711    if (av_set_parameters(oc, NULL) < 0) {
1712        return false;
1713    }
1714#endif
1715
1716#if 0
1717#if FF_API_DUMP_FORMAT
1718    dump_format(oc, 0, filename, 1);
1719#else
1720    av_dump_format(oc, 0, filename, 1);
1721#endif
1722#endif
1723
1724    /* now that all the parameters are set, we can open the audio and
1725     video codecs and allocate the necessary encode buffers */
1726    if (!video_st){
1727        return false;
1728    }
1729
1730    AVCodec *codec;
1731    AVCodecContext *c;
1732
1733#if LIBAVFORMAT_BUILD > 4628
1734    c = (video_st->codec);
1735#else
1736    c = &(video_st->codec);
1737#endif
1738
1739    c->codec_tag = fourcc;
1740    /* find the video encoder */
1741    codec = avcodec_find_encoder(c->codec_id);
1742    if (!codec) {
1743        fprintf(stderr, "Could not find encoder for codec id %d: %s", c->codec_id, icvFFMPEGErrStr(
1744        #if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(53, 2, 0)
1745                AVERROR_ENCODER_NOT_FOUND
1746        #else
1747                -1
1748        #endif
1749                ));
1750        return false;
1751    }
1752
1753    int64_t lbit_rate = (int64_t)c->bit_rate;
1754    lbit_rate += (bitrate / 2);
1755    lbit_rate = std::min(lbit_rate, (int64_t)INT_MAX);
1756    c->bit_rate_tolerance = (int)lbit_rate;
1757    c->bit_rate = (int)lbit_rate;
1758
1759    /* open the codec */
1760    if ((err=
1761#if LIBAVCODEC_VERSION_INT >= ((53<<16)+(8<<8)+0)
1762         avcodec_open2(c, codec, NULL)
1763#else
1764         avcodec_open(c, codec)
1765#endif
1766         ) < 0) {
1767        fprintf(stderr, "Could not open codec '%s': %s", codec->name, icvFFMPEGErrStr(err));
1768        return false;
1769    }
1770
1771    outbuf = NULL;
1772
1773    if (!(oc->oformat->flags & AVFMT_RAWPICTURE)) {
1774        /* allocate output buffer */
1775        /* assume we will never get codec output with more than 4 bytes per pixel... */
1776        outbuf_size = width*height*4;
1777        outbuf = (uint8_t *) av_malloc(outbuf_size);
1778    }
1779
1780    bool need_color_convert;
1781    need_color_convert = (c->pix_fmt != input_pix_fmt);
1782
1783    /* allocate the encoded raw picture */
1784    picture = icv_alloc_picture_FFMPEG(c->pix_fmt, c->width, c->height, need_color_convert);
1785    if (!picture) {
1786        return false;
1787    }
1788
1789    /* if the output format is not our input format, then a temporary
1790   picture of the input format is needed too. It is then converted
1791   to the required output format */
1792    input_picture = NULL;
1793    if ( need_color_convert ) {
1794        input_picture = icv_alloc_picture_FFMPEG(input_pix_fmt, c->width, c->height, false);
1795        if (!input_picture) {
1796            return false;
1797        }
1798    }
1799
1800    /* open the output file, if needed */
1801    if (!(fmt->flags & AVFMT_NOFILE)) {
1802#if LIBAVFORMAT_BUILD < CALC_FFMPEG_VERSION(53, 2, 0)
1803        if (url_fopen(&oc->pb, filename, URL_WRONLY) < 0)
1804#else
1805            if (avio_open(&oc->pb, filename, AVIO_FLAG_WRITE) < 0)
1806#endif
1807            {
1808            return false;
1809        }
1810    }
1811
1812#if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(52, 111, 0)
1813    /* write the stream header, if any */
1814    err=avformat_write_header(oc, NULL);
1815#else
1816    err=av_write_header( oc );
1817#endif
1818
1819    if(err < 0)
1820    {
1821        close();
1822        remove(filename);
1823        return false;
1824    }
1825    frame_width = width;
1826    frame_height = height;
1827    frame_idx = 0;
1828    ok = true;
1829
1830    return true;
1831}
1832
1833
1834
1835CvCapture_FFMPEG* cvCreateFileCapture_FFMPEG( const char* filename )
1836{
1837    CvCapture_FFMPEG* capture = (CvCapture_FFMPEG*)malloc(sizeof(*capture));
1838    capture->init();
1839    if( capture->open( filename ))
1840        return capture;
1841
1842    capture->close();
1843    free(capture);
1844    return 0;
1845}
1846
1847
1848void cvReleaseCapture_FFMPEG(CvCapture_FFMPEG** capture)
1849{
1850    if( capture && *capture )
1851    {
1852        (*capture)->close();
1853        free(*capture);
1854        *capture = 0;
1855    }
1856}
1857
1858int cvSetCaptureProperty_FFMPEG(CvCapture_FFMPEG* capture, int prop_id, double value)
1859{
1860    return capture->setProperty(prop_id, value);
1861}
1862
1863double cvGetCaptureProperty_FFMPEG(CvCapture_FFMPEG* capture, int prop_id)
1864{
1865    return capture->getProperty(prop_id);
1866}
1867
1868int cvGrabFrame_FFMPEG(CvCapture_FFMPEG* capture)
1869{
1870    return capture->grabFrame();
1871}
1872
1873int cvRetrieveFrame_FFMPEG(CvCapture_FFMPEG* capture, unsigned char** data, int* step, int* width, int* height, int* cn)
1874{
1875    return capture->retrieveFrame(0, data, step, width, height, cn);
1876}
1877
1878CvVideoWriter_FFMPEG* cvCreateVideoWriter_FFMPEG( const char* filename, int fourcc, double fps,
1879                                                  int width, int height, int isColor )
1880{
1881    CvVideoWriter_FFMPEG* writer = (CvVideoWriter_FFMPEG*)malloc(sizeof(*writer));
1882    writer->init();
1883    if( writer->open( filename, fourcc, fps, width, height, isColor != 0 ))
1884        return writer;
1885    writer->close();
1886    free(writer);
1887    return 0;
1888}
1889
1890void cvReleaseVideoWriter_FFMPEG( CvVideoWriter_FFMPEG** writer )
1891{
1892    if( writer && *writer )
1893    {
1894        (*writer)->close();
1895        free(*writer);
1896        *writer = 0;
1897    }
1898}
1899
1900
1901int cvWriteFrame_FFMPEG( CvVideoWriter_FFMPEG* writer,
1902                         const unsigned char* data, int step,
1903                         int width, int height, int cn, int origin)
1904{
1905    return writer->writeFrame(data, step, width, height, cn, origin);
1906}
1907
1908
1909
1910/*
1911 * For CUDA encoder
1912 */
1913
1914struct OutputMediaStream_FFMPEG
1915{
1916    bool open(const char* fileName, int width, int height, double fps);
1917    void close();
1918
1919    void write(unsigned char* data, int size, int keyFrame);
1920
1921    // add a video output stream to the container
1922    static AVStream* addVideoStream(AVFormatContext *oc, CV_CODEC_ID codec_id, int w, int h, int bitrate, double fps, PixelFormat pixel_format);
1923
1924    AVOutputFormat* fmt_;
1925    AVFormatContext* oc_;
1926    AVStream* video_st_;
1927};
1928
1929void OutputMediaStream_FFMPEG::close()
1930{
1931    // no more frame to compress. The codec has a latency of a few
1932    // frames if using B frames, so we get the last frames by
1933    // passing the same picture again
1934
1935    // TODO -- do we need to account for latency here?
1936
1937    if (oc_)
1938    {
1939        // write the trailer, if any
1940        av_write_trailer(oc_);
1941
1942        // free the streams
1943        for (unsigned int i = 0; i < oc_->nb_streams; ++i)
1944        {
1945            av_freep(&oc_->streams[i]->codec);
1946            av_freep(&oc_->streams[i]);
1947        }
1948
1949        if (!(fmt_->flags & AVFMT_NOFILE) && oc_->pb)
1950        {
1951            // close the output file
1952
1953            #if LIBAVCODEC_VERSION_INT < ((52<<16)+(123<<8)+0)
1954                #if LIBAVCODEC_VERSION_INT >= ((51<<16)+(49<<8)+0)
1955                    url_fclose(oc_->pb);
1956                #else
1957                    url_fclose(&oc_->pb);
1958                #endif
1959            #else
1960                avio_close(oc_->pb);
1961            #endif
1962        }
1963
1964        // free the stream
1965        av_free(oc_);
1966    }
1967}
1968
1969AVStream* OutputMediaStream_FFMPEG::addVideoStream(AVFormatContext *oc, CV_CODEC_ID codec_id, int w, int h, int bitrate, double fps, PixelFormat pixel_format)
1970{
1971    #if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(53, 10, 0)
1972        AVStream* st = avformat_new_stream(oc, 0);
1973    #else
1974        AVStream* st = av_new_stream(oc, 0);
1975    #endif
1976    if (!st)
1977        return 0;
1978
1979    #if LIBAVFORMAT_BUILD > 4628
1980        AVCodecContext* c = st->codec;
1981    #else
1982        AVCodecContext* c = &(st->codec);
1983    #endif
1984
1985    c->codec_id = codec_id;
1986    c->codec_type = AVMEDIA_TYPE_VIDEO;
1987
1988    // put sample parameters
1989    unsigned long long lbit_rate = static_cast<unsigned long long>(bitrate);
1990    lbit_rate += (bitrate / 4);
1991    lbit_rate = std::min(lbit_rate, static_cast<unsigned long long>(std::numeric_limits<int>::max()));
1992    c->bit_rate = bitrate;
1993
1994    // took advice from
1995    // http://ffmpeg-users.933282.n4.nabble.com/warning-clipping-1-dct-coefficients-to-127-127-td934297.html
1996    c->qmin = 3;
1997
1998    // resolution must be a multiple of two
1999    c->width = w;
2000    c->height = h;
2001
2002    AVCodec* codec = avcodec_find_encoder(c->codec_id);
2003
2004    // time base: this is the fundamental unit of time (in seconds) in terms
2005    // of which frame timestamps are represented. for fixed-fps content,
2006    // timebase should be 1/framerate and timestamp increments should be
2007    // identically 1
2008
2009    int frame_rate = static_cast<int>(fps+0.5);
2010    int frame_rate_base = 1;
2011    while (fabs(static_cast<double>(frame_rate)/frame_rate_base) - fps > 0.001)
2012    {
2013        frame_rate_base *= 10;
2014        frame_rate = static_cast<int>(fps*frame_rate_base + 0.5);
2015    }
2016    c->time_base.den = frame_rate;
2017    c->time_base.num = frame_rate_base;
2018
2019    #if LIBAVFORMAT_BUILD > 4752
2020        // adjust time base for supported framerates
2021        if (codec && codec->supported_framerates)
2022        {
2023            AVRational req = {frame_rate, frame_rate_base};
2024            const AVRational* best = NULL;
2025            AVRational best_error = {INT_MAX, 1};
2026
2027            for (const AVRational* p = codec->supported_framerates; p->den!=0; ++p)
2028            {
2029                AVRational error = av_sub_q(req, *p);
2030
2031                if (error.num < 0)
2032                    error.num *= -1;
2033
2034                if (av_cmp_q(error, best_error) < 0)
2035                {
2036                    best_error= error;
2037                    best= p;
2038                }
2039            }
2040
2041            c->time_base.den= best->num;
2042            c->time_base.num= best->den;
2043        }
2044    #endif
2045
2046    c->gop_size = 12; // emit one intra frame every twelve frames at most
2047    c->pix_fmt = pixel_format;
2048
2049    if (c->codec_id == CV_CODEC(CODEC_ID_MPEG2VIDEO))
2050        c->max_b_frames = 2;
2051
2052    if (c->codec_id == CV_CODEC(CODEC_ID_MPEG1VIDEO) || c->codec_id == CV_CODEC(CODEC_ID_MSMPEG4V3))
2053    {
2054        // needed to avoid using macroblocks in which some coeffs overflow
2055        // this doesnt happen with normal video, it just happens here as the
2056        // motion of the chroma plane doesnt match the luma plane
2057
2058        // avoid FFMPEG warning 'clipping 1 dct coefficients...'
2059
2060        c->mb_decision = 2;
2061    }
2062
2063    #if LIBAVCODEC_VERSION_INT > 0x000409
2064        // some formats want stream headers to be seperate
2065        if (oc->oformat->flags & AVFMT_GLOBALHEADER)
2066        {
2067            c->flags |= CODEC_FLAG_GLOBAL_HEADER;
2068        }
2069    #endif
2070
2071    return st;
2072}
2073
2074bool OutputMediaStream_FFMPEG::open(const char* fileName, int width, int height, double fps)
2075{
2076    fmt_ = 0;
2077    oc_ = 0;
2078    video_st_ = 0;
2079
2080    // auto detect the output format from the name and fourcc code
2081    #if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(53, 2, 0)
2082        fmt_ = av_guess_format(NULL, fileName, NULL);
2083    #else
2084        fmt_ = guess_format(NULL, fileName, NULL);
2085    #endif
2086    if (!fmt_)
2087        return false;
2088
2089    CV_CODEC_ID codec_id = CV_CODEC(CODEC_ID_H264);
2090
2091    // alloc memory for context
2092    #if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(53, 2, 0)
2093        oc_ = avformat_alloc_context();
2094    #else
2095        oc_ = av_alloc_format_context();
2096    #endif
2097    if (!oc_)
2098        return false;
2099
2100    // set some options
2101    oc_->oformat = fmt_;
2102    snprintf(oc_->filename, sizeof(oc_->filename), "%s", fileName);
2103
2104    oc_->max_delay = (int)(0.7 * AV_TIME_BASE); // This reduces buffer underrun warnings with MPEG
2105
2106    // set a few optimal pixel formats for lossless codecs of interest..
2107    PixelFormat codec_pix_fmt = PIX_FMT_YUV420P;
2108    int bitrate_scale = 64;
2109
2110    // TODO -- safe to ignore output audio stream?
2111    video_st_ = addVideoStream(oc_, codec_id, width, height, width * height * bitrate_scale, fps, codec_pix_fmt);
2112    if (!video_st_)
2113        return false;
2114
2115    // set the output parameters (must be done even if no parameters)
2116    #if LIBAVFORMAT_BUILD < CALC_FFMPEG_VERSION(53, 2, 0)
2117        if (av_set_parameters(oc_, NULL) < 0)
2118            return false;
2119    #endif
2120
2121    // now that all the parameters are set, we can open the audio and
2122    // video codecs and allocate the necessary encode buffers
2123
2124    #if LIBAVFORMAT_BUILD > 4628
2125        AVCodecContext* c = (video_st_->codec);
2126    #else
2127        AVCodecContext* c = &(video_st_->codec);
2128    #endif
2129
2130    c->codec_tag = MKTAG('H', '2', '6', '4');
2131    c->bit_rate_tolerance = c->bit_rate;
2132
2133    // open the output file, if needed
2134    if (!(fmt_->flags & AVFMT_NOFILE))
2135    {
2136        #if LIBAVFORMAT_BUILD < CALC_FFMPEG_VERSION(53, 2, 0)
2137            int err = url_fopen(&oc_->pb, fileName, URL_WRONLY);
2138        #else
2139            int err = avio_open(&oc_->pb, fileName, AVIO_FLAG_WRITE);
2140        #endif
2141
2142        if (err != 0)
2143            return false;
2144    }
2145
2146    // write the stream header, if any
2147    #if LIBAVFORMAT_BUILD < CALC_FFMPEG_VERSION(53, 2, 0)
2148        av_write_header(oc_);
2149    #else
2150        avformat_write_header(oc_, NULL);
2151    #endif
2152
2153    return true;
2154}
2155
2156void OutputMediaStream_FFMPEG::write(unsigned char* data, int size, int keyFrame)
2157{
2158    // if zero size, it means the image was buffered
2159    if (size > 0)
2160    {
2161        AVPacket pkt;
2162        av_init_packet(&pkt);
2163
2164        if (keyFrame)
2165            pkt.flags |= PKT_FLAG_KEY;
2166
2167        pkt.stream_index = video_st_->index;
2168        pkt.data = data;
2169        pkt.size = size;
2170
2171        // write the compressed frame in the media file
2172        av_write_frame(oc_, &pkt);
2173    }
2174}
2175
2176struct OutputMediaStream_FFMPEG* create_OutputMediaStream_FFMPEG(const char* fileName, int width, int height, double fps)
2177{
2178    OutputMediaStream_FFMPEG* stream = (OutputMediaStream_FFMPEG*) malloc(sizeof(OutputMediaStream_FFMPEG));
2179
2180    if (stream->open(fileName, width, height, fps))
2181        return stream;
2182
2183    stream->close();
2184    free(stream);
2185
2186    return 0;
2187}
2188
2189void release_OutputMediaStream_FFMPEG(struct OutputMediaStream_FFMPEG* stream)
2190{
2191    stream->close();
2192    free(stream);
2193}
2194
2195void write_OutputMediaStream_FFMPEG(struct OutputMediaStream_FFMPEG* stream, unsigned char* data, int size, int keyFrame)
2196{
2197    stream->write(data, size, keyFrame);
2198}
2199
2200/*
2201 * For CUDA decoder
2202 */
2203
2204enum
2205{
2206    VideoCodec_MPEG1 = 0,
2207    VideoCodec_MPEG2,
2208    VideoCodec_MPEG4,
2209    VideoCodec_VC1,
2210    VideoCodec_H264,
2211    VideoCodec_JPEG,
2212    VideoCodec_H264_SVC,
2213    VideoCodec_H264_MVC,
2214
2215    // Uncompressed YUV
2216    VideoCodec_YUV420 = (('I'<<24)|('Y'<<16)|('U'<<8)|('V')),   // Y,U,V (4:2:0)
2217    VideoCodec_YV12   = (('Y'<<24)|('V'<<16)|('1'<<8)|('2')),   // Y,V,U (4:2:0)
2218    VideoCodec_NV12   = (('N'<<24)|('V'<<16)|('1'<<8)|('2')),   // Y,UV  (4:2:0)
2219    VideoCodec_YUYV   = (('Y'<<24)|('U'<<16)|('Y'<<8)|('V')),   // YUYV/YUY2 (4:2:2)
2220    VideoCodec_UYVY   = (('U'<<24)|('Y'<<16)|('V'<<8)|('Y'))    // UYVY (4:2:2)
2221};
2222
2223enum
2224{
2225    VideoChromaFormat_Monochrome = 0,
2226    VideoChromaFormat_YUV420,
2227    VideoChromaFormat_YUV422,
2228    VideoChromaFormat_YUV444
2229};
2230
2231struct InputMediaStream_FFMPEG
2232{
2233public:
2234    bool open(const char* fileName, int* codec, int* chroma_format, int* width, int* height);
2235    void close();
2236
2237    bool read(unsigned char** data, int* size, int* endOfFile);
2238
2239private:
2240    InputMediaStream_FFMPEG(const InputMediaStream_FFMPEG&);
2241    InputMediaStream_FFMPEG& operator =(const InputMediaStream_FFMPEG&);
2242
2243    AVFormatContext* ctx_;
2244    int video_stream_id_;
2245    AVPacket pkt_;
2246};
2247
2248bool InputMediaStream_FFMPEG::open(const char* fileName, int* codec, int* chroma_format, int* width, int* height)
2249{
2250    int err;
2251
2252    ctx_ = 0;
2253    video_stream_id_ = -1;
2254    memset(&pkt_, 0, sizeof(AVPacket));
2255
2256    #if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(53, 13, 0)
2257        avformat_network_init();
2258    #endif
2259
2260    #if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(53, 6, 0)
2261        err = avformat_open_input(&ctx_, fileName, 0, 0);
2262    #else
2263        err = av_open_input_file(&ctx_, fileName, 0, 0, 0);
2264    #endif
2265    if (err < 0)
2266        return false;
2267
2268    #if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(53, 6, 0)
2269        err = avformat_find_stream_info(ctx_, 0);
2270    #else
2271        err = av_find_stream_info(ctx_);
2272    #endif
2273    if (err < 0)
2274        return false;
2275
2276    for (unsigned int i = 0; i < ctx_->nb_streams; ++i)
2277    {
2278        #if LIBAVFORMAT_BUILD > 4628
2279            AVCodecContext *enc = ctx_->streams[i]->codec;
2280        #else
2281            AVCodecContext *enc = &ctx_->streams[i]->codec;
2282        #endif
2283
2284        if (enc->codec_type == AVMEDIA_TYPE_VIDEO)
2285        {
2286            video_stream_id_ = static_cast<int>(i);
2287
2288            switch (enc->codec_id)
2289            {
2290            case CV_CODEC(CODEC_ID_MPEG1VIDEO):
2291                *codec = ::VideoCodec_MPEG1;
2292                break;
2293
2294            case CV_CODEC(CODEC_ID_MPEG2VIDEO):
2295                *codec = ::VideoCodec_MPEG2;
2296                break;
2297
2298            case CV_CODEC(CODEC_ID_MPEG4):
2299                *codec = ::VideoCodec_MPEG4;
2300                break;
2301
2302            case CV_CODEC(CODEC_ID_VC1):
2303                *codec = ::VideoCodec_VC1;
2304                break;
2305
2306            case CV_CODEC(CODEC_ID_H264):
2307                *codec = ::VideoCodec_H264;
2308                break;
2309
2310            default:
2311                return false;
2312            };
2313
2314            switch (enc->pix_fmt)
2315            {
2316            case PIX_FMT_YUV420P:
2317                *chroma_format = ::VideoChromaFormat_YUV420;
2318                break;
2319
2320            case PIX_FMT_YUV422P:
2321                *chroma_format = ::VideoChromaFormat_YUV422;
2322                break;
2323
2324            case PIX_FMT_YUV444P:
2325                *chroma_format = ::VideoChromaFormat_YUV444;
2326                break;
2327
2328            default:
2329                return false;
2330            }
2331
2332            *width = enc->coded_width;
2333            *height = enc->coded_height;
2334
2335            break;
2336        }
2337    }
2338
2339    if (video_stream_id_ < 0)
2340        return false;
2341
2342    av_init_packet(&pkt_);
2343
2344    return true;
2345}
2346
2347void InputMediaStream_FFMPEG::close()
2348{
2349    if (ctx_)
2350    {
2351        #if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(53, 24, 2)
2352            avformat_close_input(&ctx_);
2353        #else
2354            av_close_input_file(ctx_);
2355        #endif
2356    }
2357
2358    // free last packet if exist
2359    if (pkt_.data)
2360        av_free_packet(&pkt_);
2361}
2362
2363bool InputMediaStream_FFMPEG::read(unsigned char** data, int* size, int* endOfFile)
2364{
2365    // free last packet if exist
2366    if (pkt_.data)
2367        av_free_packet(&pkt_);
2368
2369    // get the next frame
2370    for (;;)
2371    {
2372        int ret = av_read_frame(ctx_, &pkt_);
2373
2374        if (ret == AVERROR(EAGAIN))
2375            continue;
2376
2377        if (ret < 0)
2378        {
2379            if (ret == (int)AVERROR_EOF)
2380                *endOfFile = true;
2381            return false;
2382        }
2383
2384        if (pkt_.stream_index != video_stream_id_)
2385        {
2386            av_free_packet(&pkt_);
2387            continue;
2388        }
2389
2390        break;
2391    }
2392
2393    *data = pkt_.data;
2394    *size = pkt_.size;
2395    *endOfFile = false;
2396
2397    return true;
2398}
2399
2400InputMediaStream_FFMPEG* create_InputMediaStream_FFMPEG(const char* fileName, int* codec, int* chroma_format, int* width, int* height)
2401{
2402    InputMediaStream_FFMPEG* stream = (InputMediaStream_FFMPEG*) malloc(sizeof(InputMediaStream_FFMPEG));
2403
2404    if (stream && stream->open(fileName, codec, chroma_format, width, height))
2405        return stream;
2406
2407    stream->close();
2408    free(stream);
2409
2410    return 0;
2411}
2412
2413void release_InputMediaStream_FFMPEG(InputMediaStream_FFMPEG* stream)
2414{
2415    stream->close();
2416    free(stream);
2417}
2418
2419int read_InputMediaStream_FFMPEG(InputMediaStream_FFMPEG* stream, unsigned char** data, int* size, int* endOfFile)
2420{
2421    return stream->read(data, size, endOfFile);
2422}
2423