hedgewars/avwrapper/avwrapper.c
author koda
Sun, 20 Mar 2016 03:08:51 -0400
changeset 11617 b7d5d75469ee
parent 11548 3617c611406b
child 11619 3c959df6638e
permissions -rw-r--r--
Move pixel format conversion from uVideoRec to AVWrapper This has several benefits, being in C-land allows us to better use libav API and avoid mixing memory allocated from Pascal. Also the C code for the conversion loop generated by GCC or Clang is probably more optimized than by Freepascal. Finally it will simplify code in the future if we are going to enable any other pixel format than yuv420p. Change the coefficients to improve color accuracy during conversion.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
7542
37ef1891efe2 Insert license in avwrapper.c
Stepan777 <stepik-777@mail.ru>
parents: 7376
diff changeset
     1
/*
37ef1891efe2 Insert license in avwrapper.c
Stepan777 <stepik-777@mail.ru>
parents: 7376
diff changeset
     2
 * Hedgewars, a free turn based strategy game
11046
47a8c19ecb60 more copyright fixes
sheepluva
parents: 10108
diff changeset
     3
 * Copyright (c) 2004-2015 Andrey Korotaev <unC0Rr@gmail.com>
7542
37ef1891efe2 Insert license in avwrapper.c
Stepan777 <stepik-777@mail.ru>
parents: 7376
diff changeset
     4
 *
37ef1891efe2 Insert license in avwrapper.c
Stepan777 <stepik-777@mail.ru>
parents: 7376
diff changeset
     5
 * This program is free software; you can redistribute it and/or modify
37ef1891efe2 Insert license in avwrapper.c
Stepan777 <stepik-777@mail.ru>
parents: 7376
diff changeset
     6
 * it under the terms of the GNU General Public License as published by
37ef1891efe2 Insert license in avwrapper.c
Stepan777 <stepik-777@mail.ru>
parents: 7376
diff changeset
     7
 * the Free Software Foundation; version 2 of the License
37ef1891efe2 Insert license in avwrapper.c
Stepan777 <stepik-777@mail.ru>
parents: 7376
diff changeset
     8
 *
37ef1891efe2 Insert license in avwrapper.c
Stepan777 <stepik-777@mail.ru>
parents: 7376
diff changeset
     9
 * This program is distributed in the hope that it will be useful,
37ef1891efe2 Insert license in avwrapper.c
Stepan777 <stepik-777@mail.ru>
parents: 7376
diff changeset
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
37ef1891efe2 Insert license in avwrapper.c
Stepan777 <stepik-777@mail.ru>
parents: 7376
diff changeset
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
37ef1891efe2 Insert license in avwrapper.c
Stepan777 <stepik-777@mail.ru>
parents: 7376
diff changeset
    12
 * GNU General Public License for more details.
37ef1891efe2 Insert license in avwrapper.c
Stepan777 <stepik-777@mail.ru>
parents: 7376
diff changeset
    13
 *
37ef1891efe2 Insert license in avwrapper.c
Stepan777 <stepik-777@mail.ru>
parents: 7376
diff changeset
    14
 * You should have received a copy of the GNU General Public License
37ef1891efe2 Insert license in avwrapper.c
Stepan777 <stepik-777@mail.ru>
parents: 7376
diff changeset
    15
 * along with this program; if not, write to the Free Software
10108
c68cf030eded update FSF address. note: two sdl include files (by Sam Lantinga) still have the old FSF address in their copyright - but I ain't gonna touch their copyright headers
sheepluva
parents: 9998
diff changeset
    16
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
7542
37ef1891efe2 Insert license in avwrapper.c
Stepan777 <stepik-777@mail.ru>
parents: 7376
diff changeset
    17
 */
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
    18
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
    19
#include <stdlib.h>
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
    20
#include <stdio.h>
7280
fd707afbc3a2 pagevideos is now much better that before:
Stepan777 <stepik-777@mail.ru>
parents: 7235
diff changeset
    21
#include <stdint.h>
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
    22
#include <string.h>
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
    23
#include <stdarg.h>
11298
9fcdf0969d53 Update libav API, keeping forward and backward compatibility
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11046
diff changeset
    24
9fcdf0969d53 Update libav API, keeping forward and backward compatibility
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11046
diff changeset
    25
#include "libavcodec/avcodec.h"
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
    26
#include "libavformat/avformat.h"
11298
9fcdf0969d53 Update libav API, keeping forward and backward compatibility
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11046
diff changeset
    27
#include "libavutil/avutil.h"
8065
609d07b337b5 fix deprecation warnings for libav sources
koda
parents: 7542
diff changeset
    28
#include "libavutil/mathematics.h"
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
    29
9203
bcc25cb9b122 and now also avwrapper can be shared/static, add visibility to its exported functions, drop (needed only when static)
koda
parents: 9080
diff changeset
    30
#if (defined _MSC_VER)
bcc25cb9b122 and now also avwrapper can be shared/static, add visibility to its exported functions, drop (needed only when static)
koda
parents: 9080
diff changeset
    31
#define AVWRAP_DECL __declspec(dllexport)
bcc25cb9b122 and now also avwrapper can be shared/static, add visibility to its exported functions, drop (needed only when static)
koda
parents: 9080
diff changeset
    32
#elif ((__GNUC__ >= 3) && (!__EMX__) && (!sun))
bcc25cb9b122 and now also avwrapper can be shared/static, add visibility to its exported functions, drop (needed only when static)
koda
parents: 9080
diff changeset
    33
#define AVWRAP_DECL __attribute__((visibility("default")))
bcc25cb9b122 and now also avwrapper can be shared/static, add visibility to its exported functions, drop (needed only when static)
koda
parents: 9080
diff changeset
    34
#else
bcc25cb9b122 and now also avwrapper can be shared/static, add visibility to its exported functions, drop (needed only when static)
koda
parents: 9080
diff changeset
    35
#define AVWRAP_DECL
bcc25cb9b122 and now also avwrapper can be shared/static, add visibility to its exported functions, drop (needed only when static)
koda
parents: 9080
diff changeset
    36
#endif
bcc25cb9b122 and now also avwrapper can be shared/static, add visibility to its exported functions, drop (needed only when static)
koda
parents: 9080
diff changeset
    37
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
    38
static AVFormatContext* g_pContainer;
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
    39
static AVOutputFormat* g_pFormat;
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
    40
static AVStream* g_pAStream;
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
    41
static AVStream* g_pVStream;
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
    42
static AVFrame* g_pAFrame;
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
    43
static AVFrame* g_pVFrame;
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
    44
static AVCodec* g_pACodec;
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
    45
static AVCodec* g_pVCodec;
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
    46
static AVCodecContext* g_pAudio;
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
    47
static AVCodecContext* g_pVideo;
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
    48
7198
5debd5fe526e 1. Add IFDEFs for video recording
Stepan777 <stepik-777@mail.ru>
parents: 7180
diff changeset
    49
static int g_Width, g_Height;
7280
fd707afbc3a2 pagevideos is now much better that before:
Stepan777 <stepik-777@mail.ru>
parents: 7235
diff changeset
    50
static uint32_t g_Frequency, g_Channels;
7376
48b79b3ca592 rework saving of camera positions so there is no need to know framerate during prerecording.
Stepan777 <stepik-777@mail.ru>
parents: 7359
diff changeset
    51
static int g_VQuality;
7198
5debd5fe526e 1. Add IFDEFs for video recording
Stepan777 <stepik-777@mail.ru>
parents: 7180
diff changeset
    52
static AVRational g_Framerate;
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
    53
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
    54
static FILE* g_pSoundFile;
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
    55
static int16_t* g_pSamples;
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
    56
static int g_NumSamples;
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
    57
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
    58
11298
9fcdf0969d53 Update libav API, keeping forward and backward compatibility
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11046
diff changeset
    59
// compatibility section
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
    60
#if LIBAVCODEC_VERSION_MAJOR < 54
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
    61
#define OUTBUFFER_SIZE 200000
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
    62
static uint8_t g_OutBuffer[OUTBUFFER_SIZE];
11298
9fcdf0969d53 Update libav API, keeping forward and backward compatibility
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11046
diff changeset
    63
#define avcodec_open2(x, y, z)              avcodec_open(x, y)
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
    64
#endif
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
    65
11298
9fcdf0969d53 Update libav API, keeping forward and backward compatibility
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11046
diff changeset
    66
#if LIBAVCODEC_VERSION_MAJOR < 56
9fcdf0969d53 Update libav API, keeping forward and backward compatibility
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11046
diff changeset
    67
#define av_frame_alloc                      avcodec_alloc_frame
9fcdf0969d53 Update libav API, keeping forward and backward compatibility
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11046
diff changeset
    68
#define av_frame_free                       av_freep
11368
82784d932577 videorec: Appropriately rescale timestamps and duration
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11367
diff changeset
    69
#define av_packet_rescale_ts                rescale_ts
82784d932577 videorec: Appropriately rescale timestamps and duration
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11367
diff changeset
    70
82784d932577 videorec: Appropriately rescale timestamps and duration
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11367
diff changeset
    71
static void rescale_ts(AVPacket *pkt, AVRational ctb, AVRational stb)
82784d932577 videorec: Appropriately rescale timestamps and duration
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11367
diff changeset
    72
{
82784d932577 videorec: Appropriately rescale timestamps and duration
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11367
diff changeset
    73
    if (pkt->pts != AV_NOPTS_VALUE)
82784d932577 videorec: Appropriately rescale timestamps and duration
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11367
diff changeset
    74
        pkt->pts = av_rescale_q(pkt->pts, ctb, stb);
82784d932577 videorec: Appropriately rescale timestamps and duration
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11367
diff changeset
    75
    if (pkt->dts != AV_NOPTS_VALUE)
82784d932577 videorec: Appropriately rescale timestamps and duration
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11367
diff changeset
    76
        pkt->dts = av_rescale_q(pkt->dts, ctb, stb);
82784d932577 videorec: Appropriately rescale timestamps and duration
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11367
diff changeset
    77
    if (pkt->duration > 0)
82784d932577 videorec: Appropriately rescale timestamps and duration
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11367
diff changeset
    78
        pkt->duration = av_rescale_q(pkt->duration, ctb, stb);
82784d932577 videorec: Appropriately rescale timestamps and duration
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11367
diff changeset
    79
}
11298
9fcdf0969d53 Update libav API, keeping forward and backward compatibility
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11046
diff changeset
    80
#endif
9fcdf0969d53 Update libav API, keeping forward and backward compatibility
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11046
diff changeset
    81
11406
7012234df6c4 avwrapper: Explicitly check for macro existence
koda
parents: 11401
diff changeset
    82
#ifndef AV_CODEC_CAP_DELAY
11298
9fcdf0969d53 Update libav API, keeping forward and backward compatibility
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11046
diff changeset
    83
#define AV_CODEC_CAP_DELAY                  CODEC_CAP_DELAY
11406
7012234df6c4 avwrapper: Explicitly check for macro existence
koda
parents: 11401
diff changeset
    84
#endif
7012234df6c4 avwrapper: Explicitly check for macro existence
koda
parents: 11401
diff changeset
    85
#ifndef AV_CODEC_CAP_VARIABLE_FRAME_SIZE
11298
9fcdf0969d53 Update libav API, keeping forward and backward compatibility
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11046
diff changeset
    86
#define AV_CODEC_CAP_VARIABLE_FRAME_SIZE    CODEC_CAP_VARIABLE_FRAME_SIZE
11406
7012234df6c4 avwrapper: Explicitly check for macro existence
koda
parents: 11401
diff changeset
    87
#endif
7012234df6c4 avwrapper: Explicitly check for macro existence
koda
parents: 11401
diff changeset
    88
#ifndef AV_CODEC_FLAG_GLOBAL_HEADER
11298
9fcdf0969d53 Update libav API, keeping forward and backward compatibility
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11046
diff changeset
    89
#define AV_CODEC_FLAG_GLOBAL_HEADER         CODEC_FLAG_GLOBAL_HEADER
11406
7012234df6c4 avwrapper: Explicitly check for macro existence
koda
parents: 11401
diff changeset
    90
#endif
7012234df6c4 avwrapper: Explicitly check for macro existence
koda
parents: 11401
diff changeset
    91
#ifndef AV_CODEC_FLAG_QSCALE
11298
9fcdf0969d53 Update libav API, keeping forward and backward compatibility
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11046
diff changeset
    92
#define AV_CODEC_FLAG_QSCALE                CODEC_FLAG_QSCALE
9fcdf0969d53 Update libav API, keeping forward and backward compatibility
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11046
diff changeset
    93
#endif
9fcdf0969d53 Update libav API, keeping forward and backward compatibility
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11046
diff changeset
    94
9fcdf0969d53 Update libav API, keeping forward and backward compatibility
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11046
diff changeset
    95
#if LIBAVFORMAT_VERSION_MAJOR < 53
9fcdf0969d53 Update libav API, keeping forward and backward compatibility
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11046
diff changeset
    96
#define AVIO_FLAG_WRITE                     AVIO_WRONLY
9fcdf0969d53 Update libav API, keeping forward and backward compatibility
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11046
diff changeset
    97
#endif
9fcdf0969d53 Update libav API, keeping forward and backward compatibility
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11046
diff changeset
    98
9fcdf0969d53 Update libav API, keeping forward and backward compatibility
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11046
diff changeset
    99
#if LIBAVFORMAT_VERSION_MAJOR < 54
9fcdf0969d53 Update libav API, keeping forward and backward compatibility
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11046
diff changeset
   100
#define avformat_new_stream(x, y)           av_new_stream(x, y->type == AVMEDIA_TYPE_AUDIO)
9fcdf0969d53 Update libav API, keeping forward and backward compatibility
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11046
diff changeset
   101
#endif
9fcdf0969d53 Update libav API, keeping forward and backward compatibility
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11046
diff changeset
   102
9fcdf0969d53 Update libav API, keeping forward and backward compatibility
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11046
diff changeset
   103
#if LIBAVUTIL_VERSION_MAJOR < 54
9fcdf0969d53 Update libav API, keeping forward and backward compatibility
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11046
diff changeset
   104
#define AV_PIX_FMT_YUV420P                  PIX_FMT_YUV420P
9fcdf0969d53 Update libav API, keeping forward and backward compatibility
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11046
diff changeset
   105
#endif
9fcdf0969d53 Update libav API, keeping forward and backward compatibility
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11046
diff changeset
   106
9fcdf0969d53 Update libav API, keeping forward and backward compatibility
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11046
diff changeset
   107
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   108
// pointer to function from hwengine (uUtils.pas)
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   109
static void (*AddFileLogRaw)(const char* pString);
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   110
9925
113e61a8cadc Fixed avwrapper exit calls, fixing issue 752
Gianfranco Costamagna <costamagnagianfranco@yahoo.it>
parents: 9224
diff changeset
   111
static int FatalError(const char* pFmt, ...)
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   112
{
8065
609d07b337b5 fix deprecation warnings for libav sources
koda
parents: 7542
diff changeset
   113
    char Buffer[1024];
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   114
    va_list VaArgs;
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   115
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   116
    va_start(VaArgs, pFmt);
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   117
    vsnprintf(Buffer, 1024, pFmt, VaArgs);
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   118
    va_end(VaArgs);
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   119
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   120
    AddFileLogRaw("Error in av-wrapper: ");
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   121
    AddFileLogRaw(Buffer);
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   122
    AddFileLogRaw("\n");
9925
113e61a8cadc Fixed avwrapper exit calls, fixing issue 752
Gianfranco Costamagna <costamagnagianfranco@yahoo.it>
parents: 9224
diff changeset
   123
    return(-1);
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   124
}
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   125
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   126
// Function to be called from libav for logging.
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   127
// Note: libav can call LogCallback from different threads
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   128
// (there is mutex in AddFileLogRaw).
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   129
static void LogCallback(void* p, int Level, const char* pFmt, va_list VaArgs)
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   130
{
8065
609d07b337b5 fix deprecation warnings for libav sources
koda
parents: 7542
diff changeset
   131
    char Buffer[1024];
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   132
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   133
    vsnprintf(Buffer, 1024, pFmt, VaArgs);
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   134
    AddFileLogRaw(Buffer);
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   135
}
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   136
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   137
static void Log(const char* pFmt, ...)
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   138
{
8065
609d07b337b5 fix deprecation warnings for libav sources
koda
parents: 7542
diff changeset
   139
    char Buffer[1024];
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   140
    va_list VaArgs;
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   141
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   142
    va_start(VaArgs, pFmt);
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   143
    vsnprintf(Buffer, 1024, pFmt, VaArgs);
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   144
    va_end(VaArgs);
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   145
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   146
    AddFileLogRaw(Buffer);
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   147
}
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   148
7198
5debd5fe526e 1. Add IFDEFs for video recording
Stepan777 <stepik-777@mail.ru>
parents: 7180
diff changeset
   149
static void AddAudioStream()
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   150
{
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   151
    g_pAStream = avformat_new_stream(g_pContainer, g_pACodec);
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   152
    if(!g_pAStream)
7280
fd707afbc3a2 pagevideos is now much better that before:
Stepan777 <stepik-777@mail.ru>
parents: 7235
diff changeset
   153
    {
7306
3cff5c769509 Here they come - thumbnails.
Stepan777 <stepik-777@mail.ru>
parents: 7282
diff changeset
   154
        Log("Could not allocate audio stream\n");
7280
fd707afbc3a2 pagevideos is now much better that before:
Stepan777 <stepik-777@mail.ru>
parents: 7235
diff changeset
   155
        return;
fd707afbc3a2 pagevideos is now much better that before:
Stepan777 <stepik-777@mail.ru>
parents: 7235
diff changeset
   156
    }
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   157
    g_pAStream->id = 1;
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   158
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   159
    g_pAudio = g_pAStream->codec;
7198
5debd5fe526e 1. Add IFDEFs for video recording
Stepan777 <stepik-777@mail.ru>
parents: 7180
diff changeset
   160
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   161
    avcodec_get_context_defaults3(g_pAudio, g_pACodec);
7198
5debd5fe526e 1. Add IFDEFs for video recording
Stepan777 <stepik-777@mail.ru>
parents: 7180
diff changeset
   162
    g_pAudio->codec_id = g_pACodec->id;
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   163
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   164
    // put parameters
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   165
    g_pAudio->sample_fmt = AV_SAMPLE_FMT_S16;
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   166
    g_pAudio->sample_rate = g_Frequency;
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   167
    g_pAudio->channels = g_Channels;
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   168
11367
846aa36f7cdc videorec: Always initialize audio and video time bases
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11366
diff changeset
   169
    // set time base as invers of sample rate
846aa36f7cdc videorec: Always initialize audio and video time bases
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11366
diff changeset
   170
    g_pAudio->time_base.den = g_pAStream->time_base.den = g_Frequency;
846aa36f7cdc videorec: Always initialize audio and video time bases
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11366
diff changeset
   171
    g_pAudio->time_base.num = g_pAStream->time_base.num = 1;
846aa36f7cdc videorec: Always initialize audio and video time bases
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11366
diff changeset
   172
7198
5debd5fe526e 1. Add IFDEFs for video recording
Stepan777 <stepik-777@mail.ru>
parents: 7180
diff changeset
   173
    // set quality
7376
48b79b3ca592 rework saving of camera positions so there is no need to know framerate during prerecording.
Stepan777 <stepik-777@mail.ru>
parents: 7359
diff changeset
   174
    g_pAudio->bit_rate = 160000;
48b79b3ca592 rework saving of camera positions so there is no need to know framerate during prerecording.
Stepan777 <stepik-777@mail.ru>
parents: 7359
diff changeset
   175
48b79b3ca592 rework saving of camera positions so there is no need to know framerate during prerecording.
Stepan777 <stepik-777@mail.ru>
parents: 7359
diff changeset
   176
    // for codecs that support variable bitrate use it, it should be better
11298
9fcdf0969d53 Update libav API, keeping forward and backward compatibility
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11046
diff changeset
   177
    g_pAudio->flags |= AV_CODEC_FLAG_QSCALE;
7376
48b79b3ca592 rework saving of camera positions so there is no need to know framerate during prerecording.
Stepan777 <stepik-777@mail.ru>
parents: 7359
diff changeset
   178
    g_pAudio->global_quality = 1*FF_QP2LAMBDA;
7198
5debd5fe526e 1. Add IFDEFs for video recording
Stepan777 <stepik-777@mail.ru>
parents: 7180
diff changeset
   179
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   180
    // some formats want stream headers to be separate
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   181
    if (g_pFormat->flags & AVFMT_GLOBALHEADER)
11298
9fcdf0969d53 Update libav API, keeping forward and backward compatibility
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11046
diff changeset
   182
        g_pAudio->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   183
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   184
    // open it
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   185
    if (avcodec_open2(g_pAudio, g_pACodec, NULL) < 0)
7280
fd707afbc3a2 pagevideos is now much better that before:
Stepan777 <stepik-777@mail.ru>
parents: 7235
diff changeset
   186
    {
7306
3cff5c769509 Here they come - thumbnails.
Stepan777 <stepik-777@mail.ru>
parents: 7282
diff changeset
   187
        Log("Could not open audio codec %s\n", g_pACodec->long_name);
7280
fd707afbc3a2 pagevideos is now much better that before:
Stepan777 <stepik-777@mail.ru>
parents: 7235
diff changeset
   188
        return;
fd707afbc3a2 pagevideos is now much better that before:
Stepan777 <stepik-777@mail.ru>
parents: 7235
diff changeset
   189
    }
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   190
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   191
#if LIBAVCODEC_VERSION_MAJOR >= 54
11298
9fcdf0969d53 Update libav API, keeping forward and backward compatibility
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11046
diff changeset
   192
    if (g_pACodec->capabilities & AV_CODEC_CAP_VARIABLE_FRAME_SIZE)
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   193
#else
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   194
    if (g_pAudio->frame_size == 0)
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   195
#endif
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   196
        g_NumSamples = 4096;
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   197
    else
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   198
        g_NumSamples = g_pAudio->frame_size;
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   199
    g_pSamples = (int16_t*)av_malloc(g_NumSamples*g_Channels*sizeof(int16_t));
11298
9fcdf0969d53 Update libav API, keeping forward and backward compatibility
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11046
diff changeset
   200
    g_pAFrame = av_frame_alloc();
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   201
    if (!g_pAFrame)
7280
fd707afbc3a2 pagevideos is now much better that before:
Stepan777 <stepik-777@mail.ru>
parents: 7235
diff changeset
   202
    {
7306
3cff5c769509 Here they come - thumbnails.
Stepan777 <stepik-777@mail.ru>
parents: 7282
diff changeset
   203
        Log("Could not allocate frame\n");
7280
fd707afbc3a2 pagevideos is now much better that before:
Stepan777 <stepik-777@mail.ru>
parents: 7235
diff changeset
   204
        return;
fd707afbc3a2 pagevideos is now much better that before:
Stepan777 <stepik-777@mail.ru>
parents: 7235
diff changeset
   205
    }
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   206
}
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   207
9925
113e61a8cadc Fixed avwrapper exit calls, fixing issue 752
Gianfranco Costamagna <costamagnagianfranco@yahoo.it>
parents: 9224
diff changeset
   208
// returns non-zero if there is more sound, -1 in case of error
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   209
static int WriteAudioFrame()
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   210
{
7198
5debd5fe526e 1. Add IFDEFs for video recording
Stepan777 <stepik-777@mail.ru>
parents: 7180
diff changeset
   211
    if (!g_pAStream)
5debd5fe526e 1. Add IFDEFs for video recording
Stepan777 <stepik-777@mail.ru>
parents: 7180
diff changeset
   212
        return 0;
5debd5fe526e 1. Add IFDEFs for video recording
Stepan777 <stepik-777@mail.ru>
parents: 7180
diff changeset
   213
11300
f9fa0d6dc69f Let initialization happen in the appropriate function
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11298
diff changeset
   214
    AVPacket Packet;
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   215
    av_init_packet(&Packet);
11364
f830c080aa9d videorec: Make sure the audio packet is considered empty
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11316
diff changeset
   216
    Packet.data = NULL;
f830c080aa9d videorec: Make sure the audio packet is considered empty
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11316
diff changeset
   217
    Packet.size = 0;
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   218
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   219
    int NumSamples = fread(g_pSamples, 2*g_Channels, g_NumSamples, g_pSoundFile);
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   220
8065
609d07b337b5 fix deprecation warnings for libav sources
koda
parents: 7542
diff changeset
   221
#if LIBAVCODEC_VERSION_MAJOR >= 53
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   222
    AVFrame* pFrame = NULL;
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   223
    if (NumSamples > 0)
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   224
    {
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   225
        g_pAFrame->nb_samples = NumSamples;
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   226
        avcodec_fill_audio_frame(g_pAFrame, g_Channels, AV_SAMPLE_FMT_S16,
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   227
                                 (uint8_t*)g_pSamples, NumSamples*2*g_Channels, 1);
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   228
        pFrame = g_pAFrame;
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   229
    }
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   230
    // when NumSamples == 0 we still need to call encode_audio2 to flush
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   231
    int got_packet;
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   232
    if (avcodec_encode_audio2(g_pAudio, &Packet, pFrame, &got_packet) != 0)
9925
113e61a8cadc Fixed avwrapper exit calls, fixing issue 752
Gianfranco Costamagna <costamagnagianfranco@yahoo.it>
parents: 9224
diff changeset
   233
        return FatalError("avcodec_encode_audio2 failed");
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   234
    if (!got_packet)
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   235
        return 0;
11368
82784d932577 videorec: Appropriately rescale timestamps and duration
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11367
diff changeset
   236
82784d932577 videorec: Appropriately rescale timestamps and duration
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11367
diff changeset
   237
    av_packet_rescale_ts(&Packet, g_pAudio->time_base, g_pAStream->time_base);
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   238
#else
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   239
    if (NumSamples == 0)
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   240
        return 0;
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   241
    int BufferSize = OUTBUFFER_SIZE;
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   242
    if (g_pAudio->frame_size == 0)
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   243
        BufferSize = NumSamples*g_Channels*2;
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   244
    Packet.size = avcodec_encode_audio(g_pAudio, g_OutBuffer, BufferSize, g_pSamples);
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   245
    if (Packet.size == 0)
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   246
        return 1;
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   247
    if (g_pAudio->coded_frame && g_pAudio->coded_frame->pts != AV_NOPTS_VALUE)
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   248
        Packet.pts = av_rescale_q(g_pAudio->coded_frame->pts, g_pAudio->time_base, g_pAStream->time_base);
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   249
    Packet.flags |= AV_PKT_FLAG_KEY;
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   250
    Packet.data = g_OutBuffer;
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   251
#endif
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   252
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   253
    // Write the compressed frame to the media file.
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   254
    Packet.stream_index = g_pAStream->index;
8811
dcdfcddf37ee move avwraper compilation in its own folder
koda
parents: 8065
diff changeset
   255
    if (av_interleaved_write_frame(g_pContainer, &Packet) != 0)
9925
113e61a8cadc Fixed avwrapper exit calls, fixing issue 752
Gianfranco Costamagna <costamagnagianfranco@yahoo.it>
parents: 9224
diff changeset
   256
        return FatalError("Error while writing audio frame");
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   257
    return 1;
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   258
}
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   259
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   260
// add a video output stream
9925
113e61a8cadc Fixed avwrapper exit calls, fixing issue 752
Gianfranco Costamagna <costamagnagianfranco@yahoo.it>
parents: 9224
diff changeset
   261
static int AddVideoStream()
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   262
{
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   263
    g_pVStream = avformat_new_stream(g_pContainer, g_pVCodec);
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   264
    if (!g_pVStream)
9925
113e61a8cadc Fixed avwrapper exit calls, fixing issue 752
Gianfranco Costamagna <costamagnagianfranco@yahoo.it>
parents: 9224
diff changeset
   265
        return FatalError("Could not allocate video stream");
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   266
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   267
    g_pVideo = g_pVStream->codec;
7235
baa69bd025d9 1. Implement new page in frontend with options for video recording.
Stepan777 <stepik-777@mail.ru>
parents: 7198
diff changeset
   268
7198
5debd5fe526e 1. Add IFDEFs for video recording
Stepan777 <stepik-777@mail.ru>
parents: 7180
diff changeset
   269
    avcodec_get_context_defaults3(g_pVideo, g_pVCodec);
5debd5fe526e 1. Add IFDEFs for video recording
Stepan777 <stepik-777@mail.ru>
parents: 7180
diff changeset
   270
    g_pVideo->codec_id = g_pVCodec->id;
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   271
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   272
    // put parameters
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   273
    // resolution must be a multiple of two
7282
c65992e2d794 correctly fix odd dimensions (it was incorrectly fixed in previous commit)
Stepan777 <stepik-777@mail.ru>
parents: 7280
diff changeset
   274
    g_pVideo->width  = g_Width  & ~1; // make even (dimensions should be even)
c65992e2d794 correctly fix odd dimensions (it was incorrectly fixed in previous commit)
Stepan777 <stepik-777@mail.ru>
parents: 7280
diff changeset
   275
    g_pVideo->height = g_Height & ~1; // make even
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   276
    /* time base: this is the fundamental unit of time (in seconds) in terms
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   277
       of which frame timestamps are represented. for fixed-fps content,
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   278
       timebase should be 1/framerate and timestamp increments should be
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   279
       identically 1. */
11367
846aa36f7cdc videorec: Always initialize audio and video time bases
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11366
diff changeset
   280
    g_pVideo->time_base.den = g_pVStream->time_base.den = g_Framerate.num;
846aa36f7cdc videorec: Always initialize audio and video time bases
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11366
diff changeset
   281
    g_pVideo->time_base.num = g_pVStream->time_base.num = g_Framerate.den;
11370
7ab863821864 videorec: Drop a commented out option
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11369
diff changeset
   282
11298
9fcdf0969d53 Update libav API, keeping forward and backward compatibility
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11046
diff changeset
   283
    g_pVideo->pix_fmt = AV_PIX_FMT_YUV420P;
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   284
7198
5debd5fe526e 1. Add IFDEFs for video recording
Stepan777 <stepik-777@mail.ru>
parents: 7180
diff changeset
   285
    // set quality
5debd5fe526e 1. Add IFDEFs for video recording
Stepan777 <stepik-777@mail.ru>
parents: 7180
diff changeset
   286
    if (g_VQuality > 100)
5debd5fe526e 1. Add IFDEFs for video recording
Stepan777 <stepik-777@mail.ru>
parents: 7180
diff changeset
   287
        g_pVideo->bit_rate = g_VQuality;
5debd5fe526e 1. Add IFDEFs for video recording
Stepan777 <stepik-777@mail.ru>
parents: 7180
diff changeset
   288
    else
5debd5fe526e 1. Add IFDEFs for video recording
Stepan777 <stepik-777@mail.ru>
parents: 7180
diff changeset
   289
    {
11298
9fcdf0969d53 Update libav API, keeping forward and backward compatibility
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11046
diff changeset
   290
        g_pVideo->flags |= AV_CODEC_FLAG_QSCALE;
7198
5debd5fe526e 1. Add IFDEFs for video recording
Stepan777 <stepik-777@mail.ru>
parents: 7180
diff changeset
   291
        g_pVideo->global_quality = g_VQuality*FF_QP2LAMBDA;
5debd5fe526e 1. Add IFDEFs for video recording
Stepan777 <stepik-777@mail.ru>
parents: 7180
diff changeset
   292
    }
5debd5fe526e 1. Add IFDEFs for video recording
Stepan777 <stepik-777@mail.ru>
parents: 7180
diff changeset
   293
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   294
    // some formats want stream headers to be separate
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   295
    if (g_pFormat->flags & AVFMT_GLOBALHEADER)
11298
9fcdf0969d53 Update libav API, keeping forward and backward compatibility
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11046
diff changeset
   296
        g_pVideo->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   297
8065
609d07b337b5 fix deprecation warnings for libav sources
koda
parents: 7542
diff changeset
   298
#if LIBAVCODEC_VERSION_MAJOR < 53
7376
48b79b3ca592 rework saving of camera positions so there is no need to know framerate during prerecording.
Stepan777 <stepik-777@mail.ru>
parents: 7359
diff changeset
   299
    // for some versions of ffmpeg x264 options must be set explicitly
48b79b3ca592 rework saving of camera positions so there is no need to know framerate during prerecording.
Stepan777 <stepik-777@mail.ru>
parents: 7359
diff changeset
   300
    if (strcmp(g_pVCodec->name, "libx264") == 0)
48b79b3ca592 rework saving of camera positions so there is no need to know framerate during prerecording.
Stepan777 <stepik-777@mail.ru>
parents: 7359
diff changeset
   301
    {
48b79b3ca592 rework saving of camera positions so there is no need to know framerate during prerecording.
Stepan777 <stepik-777@mail.ru>
parents: 7359
diff changeset
   302
        g_pVideo->coder_type = FF_CODER_TYPE_AC;
48b79b3ca592 rework saving of camera positions so there is no need to know framerate during prerecording.
Stepan777 <stepik-777@mail.ru>
parents: 7359
diff changeset
   303
        g_pVideo->flags |= CODEC_FLAG_LOOP_FILTER;
48b79b3ca592 rework saving of camera positions so there is no need to know framerate during prerecording.
Stepan777 <stepik-777@mail.ru>
parents: 7359
diff changeset
   304
        g_pVideo->crf = 23;
48b79b3ca592 rework saving of camera positions so there is no need to know framerate during prerecording.
Stepan777 <stepik-777@mail.ru>
parents: 7359
diff changeset
   305
        g_pVideo->thread_count = 3;
48b79b3ca592 rework saving of camera positions so there is no need to know framerate during prerecording.
Stepan777 <stepik-777@mail.ru>
parents: 7359
diff changeset
   306
        g_pVideo->me_cmp = FF_CMP_CHROMA;
48b79b3ca592 rework saving of camera positions so there is no need to know framerate during prerecording.
Stepan777 <stepik-777@mail.ru>
parents: 7359
diff changeset
   307
        g_pVideo->partitions = X264_PART_I8X8 | X264_PART_I4X4 | X264_PART_P8X8 | X264_PART_B8X8;
48b79b3ca592 rework saving of camera positions so there is no need to know framerate during prerecording.
Stepan777 <stepik-777@mail.ru>
parents: 7359
diff changeset
   308
        g_pVideo->me_method = ME_HEX;
48b79b3ca592 rework saving of camera positions so there is no need to know framerate during prerecording.
Stepan777 <stepik-777@mail.ru>
parents: 7359
diff changeset
   309
        g_pVideo->me_subpel_quality = 7;
48b79b3ca592 rework saving of camera positions so there is no need to know framerate during prerecording.
Stepan777 <stepik-777@mail.ru>
parents: 7359
diff changeset
   310
        g_pVideo->me_range = 16;
48b79b3ca592 rework saving of camera positions so there is no need to know framerate during prerecording.
Stepan777 <stepik-777@mail.ru>
parents: 7359
diff changeset
   311
        g_pVideo->gop_size = 250;
48b79b3ca592 rework saving of camera positions so there is no need to know framerate during prerecording.
Stepan777 <stepik-777@mail.ru>
parents: 7359
diff changeset
   312
        g_pVideo->keyint_min = 25;
48b79b3ca592 rework saving of camera positions so there is no need to know framerate during prerecording.
Stepan777 <stepik-777@mail.ru>
parents: 7359
diff changeset
   313
        g_pVideo->scenechange_threshold = 40;
48b79b3ca592 rework saving of camera positions so there is no need to know framerate during prerecording.
Stepan777 <stepik-777@mail.ru>
parents: 7359
diff changeset
   314
        g_pVideo->i_quant_factor = 0.71;
48b79b3ca592 rework saving of camera positions so there is no need to know framerate during prerecording.
Stepan777 <stepik-777@mail.ru>
parents: 7359
diff changeset
   315
        g_pVideo->b_frame_strategy = 1;
48b79b3ca592 rework saving of camera positions so there is no need to know framerate during prerecording.
Stepan777 <stepik-777@mail.ru>
parents: 7359
diff changeset
   316
        g_pVideo->qcompress = 0.6;
48b79b3ca592 rework saving of camera positions so there is no need to know framerate during prerecording.
Stepan777 <stepik-777@mail.ru>
parents: 7359
diff changeset
   317
        g_pVideo->qmin = 10;
48b79b3ca592 rework saving of camera positions so there is no need to know framerate during prerecording.
Stepan777 <stepik-777@mail.ru>
parents: 7359
diff changeset
   318
        g_pVideo->qmax = 51;
48b79b3ca592 rework saving of camera positions so there is no need to know framerate during prerecording.
Stepan777 <stepik-777@mail.ru>
parents: 7359
diff changeset
   319
        g_pVideo->max_qdiff = 4;
48b79b3ca592 rework saving of camera positions so there is no need to know framerate during prerecording.
Stepan777 <stepik-777@mail.ru>
parents: 7359
diff changeset
   320
        g_pVideo->max_b_frames = 3;
48b79b3ca592 rework saving of camera positions so there is no need to know framerate during prerecording.
Stepan777 <stepik-777@mail.ru>
parents: 7359
diff changeset
   321
        g_pVideo->refs = 3;
48b79b3ca592 rework saving of camera positions so there is no need to know framerate during prerecording.
Stepan777 <stepik-777@mail.ru>
parents: 7359
diff changeset
   322
        g_pVideo->directpred = 1;
48b79b3ca592 rework saving of camera positions so there is no need to know framerate during prerecording.
Stepan777 <stepik-777@mail.ru>
parents: 7359
diff changeset
   323
        g_pVideo->trellis = 1;
48b79b3ca592 rework saving of camera positions so there is no need to know framerate during prerecording.
Stepan777 <stepik-777@mail.ru>
parents: 7359
diff changeset
   324
        g_pVideo->flags2 = CODEC_FLAG2_BPYRAMID | CODEC_FLAG2_MIXED_REFS | CODEC_FLAG2_WPRED | CODEC_FLAG2_8X8DCT | CODEC_FLAG2_FASTPSKIP;
48b79b3ca592 rework saving of camera positions so there is no need to know framerate during prerecording.
Stepan777 <stepik-777@mail.ru>
parents: 7359
diff changeset
   325
        g_pVideo->weighted_p_pred = 2;
48b79b3ca592 rework saving of camera positions so there is no need to know framerate during prerecording.
Stepan777 <stepik-777@mail.ru>
parents: 7359
diff changeset
   326
    }
48b79b3ca592 rework saving of camera positions so there is no need to know framerate during prerecording.
Stepan777 <stepik-777@mail.ru>
parents: 7359
diff changeset
   327
#endif
48b79b3ca592 rework saving of camera positions so there is no need to know framerate during prerecording.
Stepan777 <stepik-777@mail.ru>
parents: 7359
diff changeset
   328
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   329
    // open the codec
11316
516e9b1ac889 videorec: Drop setting x264 preset
koda
parents: 11300
diff changeset
   330
    if (avcodec_open2(g_pVideo, g_pVCodec, NULL) < 0)
9925
113e61a8cadc Fixed avwrapper exit calls, fixing issue 752
Gianfranco Costamagna <costamagnagianfranco@yahoo.it>
parents: 9224
diff changeset
   331
        return FatalError("Could not open video codec %s", g_pVCodec->long_name);
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   332
11298
9fcdf0969d53 Update libav API, keeping forward and backward compatibility
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11046
diff changeset
   333
    g_pVFrame = av_frame_alloc();
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   334
    if (!g_pVFrame)
9925
113e61a8cadc Fixed avwrapper exit calls, fixing issue 752
Gianfranco Costamagna <costamagnagianfranco@yahoo.it>
parents: 9224
diff changeset
   335
        return FatalError("Could not allocate frame");
11617
b7d5d75469ee Move pixel format conversion from uVideoRec to AVWrapper
koda
parents: 11548
diff changeset
   336
    av_frame_unref(g_pVFrame);
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   337
11366
dc17a495ee7f videorec: Fully set frame properties
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11365
diff changeset
   338
    g_pVFrame->width = g_Width;
dc17a495ee7f videorec: Fully set frame properties
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11365
diff changeset
   339
    g_pVFrame->height = g_Height;
dc17a495ee7f videorec: Fully set frame properties
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11365
diff changeset
   340
    g_pVFrame->format = AV_PIX_FMT_YUV420P;
11617
b7d5d75469ee Move pixel format conversion from uVideoRec to AVWrapper
koda
parents: 11548
diff changeset
   341
b7d5d75469ee Move pixel format conversion from uVideoRec to AVWrapper
koda
parents: 11548
diff changeset
   342
    return avcodec_default_get_buffer2(g_pVideo, g_pVFrame, 0);
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   343
}
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   344
7280
fd707afbc3a2 pagevideos is now much better that before:
Stepan777 <stepik-777@mail.ru>
parents: 7235
diff changeset
   345
static int WriteFrame(AVFrame* pFrame)
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   346
{
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   347
    double AudioTime, VideoTime;
9925
113e61a8cadc Fixed avwrapper exit calls, fixing issue 752
Gianfranco Costamagna <costamagnagianfranco@yahoo.it>
parents: 9224
diff changeset
   348
    int ret;
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   349
    // write interleaved audio frame
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   350
    if (g_pAStream)
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   351
    {
11298
9fcdf0969d53 Update libav API, keeping forward and backward compatibility
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11046
diff changeset
   352
        VideoTime = (double)g_pVFrame->pts * g_pVStream->time_base.num/g_pVStream->time_base.den;
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   353
        do
9925
113e61a8cadc Fixed avwrapper exit calls, fixing issue 752
Gianfranco Costamagna <costamagnagianfranco@yahoo.it>
parents: 9224
diff changeset
   354
        {
11298
9fcdf0969d53 Update libav API, keeping forward and backward compatibility
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11046
diff changeset
   355
            AudioTime = (double)g_pAFrame->pts * g_pAStream->time_base.num/g_pAStream->time_base.den;
9925
113e61a8cadc Fixed avwrapper exit calls, fixing issue 752
Gianfranco Costamagna <costamagnagianfranco@yahoo.it>
parents: 9224
diff changeset
   356
            ret = WriteAudioFrame();
113e61a8cadc Fixed avwrapper exit calls, fixing issue 752
Gianfranco Costamagna <costamagnagianfranco@yahoo.it>
parents: 9224
diff changeset
   357
        }
113e61a8cadc Fixed avwrapper exit calls, fixing issue 752
Gianfranco Costamagna <costamagnagianfranco@yahoo.it>
parents: 9224
diff changeset
   358
        while (AudioTime < VideoTime && ret);
113e61a8cadc Fixed avwrapper exit calls, fixing issue 752
Gianfranco Costamagna <costamagnagianfranco@yahoo.it>
parents: 9224
diff changeset
   359
        if (ret < 0)
113e61a8cadc Fixed avwrapper exit calls, fixing issue 752
Gianfranco Costamagna <costamagnagianfranco@yahoo.it>
parents: 9224
diff changeset
   360
            return ret;
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   361
    }
8811
dcdfcddf37ee move avwraper compilation in its own folder
koda
parents: 8065
diff changeset
   362
7198
5debd5fe526e 1. Add IFDEFs for video recording
Stepan777 <stepik-777@mail.ru>
parents: 7180
diff changeset
   363
    if (!g_pVStream)
5debd5fe526e 1. Add IFDEFs for video recording
Stepan777 <stepik-777@mail.ru>
parents: 7180
diff changeset
   364
        return 0;
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   365
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   366
    AVPacket Packet;
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   367
    av_init_packet(&Packet);
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   368
    Packet.data = NULL;
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   369
    Packet.size = 0;
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   370
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   371
    g_pVFrame->pts++;
11369
ce154ffb9a8b videorec: Use future API for raw video encoding
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11368
diff changeset
   372
#if LIBAVCODEC_VERSION_MAJOR < 58
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   373
    if (g_pFormat->flags & AVFMT_RAWPICTURE)
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   374
    {
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   375
        /* raw video case. The API will change slightly in the near
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   376
           future for that. */
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   377
        Packet.flags |= AV_PKT_FLAG_KEY;
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   378
        Packet.stream_index = g_pVStream->index;
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   379
        Packet.data = (uint8_t*)pFrame;
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   380
        Packet.size = sizeof(AVPicture);
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   381
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   382
        if (av_interleaved_write_frame(g_pContainer, &Packet) != 0)
9925
113e61a8cadc Fixed avwrapper exit calls, fixing issue 752
Gianfranco Costamagna <costamagnagianfranco@yahoo.it>
parents: 9224
diff changeset
   383
            return FatalError("Error while writing video frame");
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   384
        return 0;
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   385
    }
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   386
    else
11369
ce154ffb9a8b videorec: Use future API for raw video encoding
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11368
diff changeset
   387
#endif
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   388
    {
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   389
#if LIBAVCODEC_VERSION_MAJOR >= 54
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   390
        int got_packet;
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   391
        if (avcodec_encode_video2(g_pVideo, &Packet, pFrame, &got_packet) < 0)
9925
113e61a8cadc Fixed avwrapper exit calls, fixing issue 752
Gianfranco Costamagna <costamagnagianfranco@yahoo.it>
parents: 9224
diff changeset
   392
            return FatalError("avcodec_encode_video2 failed");
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   393
        if (!got_packet)
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   394
            return 0;
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   395
11368
82784d932577 videorec: Appropriately rescale timestamps and duration
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11367
diff changeset
   396
        av_packet_rescale_ts(&Packet, g_pVideo->time_base, g_pVStream->time_base);
8811
dcdfcddf37ee move avwraper compilation in its own folder
koda
parents: 8065
diff changeset
   397
#else
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   398
        Packet.size = avcodec_encode_video(g_pVideo, g_OutBuffer, OUTBUFFER_SIZE, pFrame);
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   399
        if (Packet.size < 0)
9925
113e61a8cadc Fixed avwrapper exit calls, fixing issue 752
Gianfranco Costamagna <costamagnagianfranco@yahoo.it>
parents: 9224
diff changeset
   400
            return FatalError("avcodec_encode_video failed");
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   401
        if (Packet.size == 0)
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   402
            return 0;
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   403
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   404
        if( g_pVideo->coded_frame->pts != AV_NOPTS_VALUE)
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   405
            Packet.pts = av_rescale_q(g_pVideo->coded_frame->pts, g_pVideo->time_base, g_pVStream->time_base);
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   406
        if( g_pVideo->coded_frame->key_frame )
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   407
            Packet.flags |= AV_PKT_FLAG_KEY;
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   408
        Packet.data = g_OutBuffer;
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   409
#endif
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   410
        // write the compressed frame in the media file
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   411
        Packet.stream_index = g_pVStream->index;
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   412
        if (av_interleaved_write_frame(g_pContainer, &Packet) != 0)
9925
113e61a8cadc Fixed avwrapper exit calls, fixing issue 752
Gianfranco Costamagna <costamagnagianfranco@yahoo.it>
parents: 9224
diff changeset
   413
            return FatalError("Error while writing video frame");
8811
dcdfcddf37ee move avwraper compilation in its own folder
koda
parents: 8065
diff changeset
   414
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   415
        return 1;
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   416
    }
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   417
}
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   418
11617
b7d5d75469ee Move pixel format conversion from uVideoRec to AVWrapper
koda
parents: 11548
diff changeset
   419
AVWRAP_DECL int AVWrapper_WriteFrame(uint8_t *buf)
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   420
{
11617
b7d5d75469ee Move pixel format conversion from uVideoRec to AVWrapper
koda
parents: 11548
diff changeset
   421
    int x, y, stride = g_Width * 4;
b7d5d75469ee Move pixel format conversion from uVideoRec to AVWrapper
koda
parents: 11548
diff changeset
   422
    uint8_t *data[3];
b7d5d75469ee Move pixel format conversion from uVideoRec to AVWrapper
koda
parents: 11548
diff changeset
   423
b7d5d75469ee Move pixel format conversion from uVideoRec to AVWrapper
koda
parents: 11548
diff changeset
   424
    // copy pointers, prepare source
b7d5d75469ee Move pixel format conversion from uVideoRec to AVWrapper
koda
parents: 11548
diff changeset
   425
    memcpy(data, g_pVFrame->data, sizeof(data));
b7d5d75469ee Move pixel format conversion from uVideoRec to AVWrapper
koda
parents: 11548
diff changeset
   426
    buf += (g_Height - 1) * stride;
b7d5d75469ee Move pixel format conversion from uVideoRec to AVWrapper
koda
parents: 11548
diff changeset
   427
b7d5d75469ee Move pixel format conversion from uVideoRec to AVWrapper
koda
parents: 11548
diff changeset
   428
    // convert to YUV 4:2:0
b7d5d75469ee Move pixel format conversion from uVideoRec to AVWrapper
koda
parents: 11548
diff changeset
   429
    for (y = 0; y < g_Height; y++) {
b7d5d75469ee Move pixel format conversion from uVideoRec to AVWrapper
koda
parents: 11548
diff changeset
   430
        for (x = 0; x < g_Width; x++) {
b7d5d75469ee Move pixel format conversion from uVideoRec to AVWrapper
koda
parents: 11548
diff changeset
   431
            int r = buf[x * 4 + 0];
b7d5d75469ee Move pixel format conversion from uVideoRec to AVWrapper
koda
parents: 11548
diff changeset
   432
            int g = buf[x * 4 + 1];
b7d5d75469ee Move pixel format conversion from uVideoRec to AVWrapper
koda
parents: 11548
diff changeset
   433
            int b = buf[x * 4 + 2];
b7d5d75469ee Move pixel format conversion from uVideoRec to AVWrapper
koda
parents: 11548
diff changeset
   434
b7d5d75469ee Move pixel format conversion from uVideoRec to AVWrapper
koda
parents: 11548
diff changeset
   435
            int luma = (int)(0.299f * r +  0.587f * g + 0.114f * b);
b7d5d75469ee Move pixel format conversion from uVideoRec to AVWrapper
koda
parents: 11548
diff changeset
   436
            data[0][x] = av_clip_uint8(luma);
b7d5d75469ee Move pixel format conversion from uVideoRec to AVWrapper
koda
parents: 11548
diff changeset
   437
b7d5d75469ee Move pixel format conversion from uVideoRec to AVWrapper
koda
parents: 11548
diff changeset
   438
            if (!(x & 1) && !(y & 1)) {
b7d5d75469ee Move pixel format conversion from uVideoRec to AVWrapper
koda
parents: 11548
diff changeset
   439
                int r = (buf[x * 4 + 0]          + buf[(x + 1) * 4 + 0] +
b7d5d75469ee Move pixel format conversion from uVideoRec to AVWrapper
koda
parents: 11548
diff changeset
   440
                         buf[x * 4 + 0 + stride] + buf[(x + 1) * 4 + 0 + stride]) / 4;
b7d5d75469ee Move pixel format conversion from uVideoRec to AVWrapper
koda
parents: 11548
diff changeset
   441
                int g = (buf[x * 4 + 1]          + buf[(x + 1) * 4 + 1] +
b7d5d75469ee Move pixel format conversion from uVideoRec to AVWrapper
koda
parents: 11548
diff changeset
   442
                         buf[x * 4 + 1 + stride] + buf[(x + 1) * 4 + 1 + stride]) / 4;
b7d5d75469ee Move pixel format conversion from uVideoRec to AVWrapper
koda
parents: 11548
diff changeset
   443
                int b = (buf[x * 4 + 2]          + buf[(x + 1) * 4 + 2] +
b7d5d75469ee Move pixel format conversion from uVideoRec to AVWrapper
koda
parents: 11548
diff changeset
   444
                         buf[x * 4 + 2 + stride] + buf[(x + 1) * 4 + 2 + stride]) / 4;
b7d5d75469ee Move pixel format conversion from uVideoRec to AVWrapper
koda
parents: 11548
diff changeset
   445
b7d5d75469ee Move pixel format conversion from uVideoRec to AVWrapper
koda
parents: 11548
diff changeset
   446
                int cr = (int)(-0.14713f * r - 0.28886f * g + 0.436f   * b);
b7d5d75469ee Move pixel format conversion from uVideoRec to AVWrapper
koda
parents: 11548
diff changeset
   447
                int cb = (int)( 0.615f   * r - 0.51499f * g - 0.10001f * b);
b7d5d75469ee Move pixel format conversion from uVideoRec to AVWrapper
koda
parents: 11548
diff changeset
   448
                data[1][x / 2] = av_clip_uint8(128 + cr);
b7d5d75469ee Move pixel format conversion from uVideoRec to AVWrapper
koda
parents: 11548
diff changeset
   449
                data[2][x / 2] = av_clip_uint8(128 + cb);
b7d5d75469ee Move pixel format conversion from uVideoRec to AVWrapper
koda
parents: 11548
diff changeset
   450
            }
b7d5d75469ee Move pixel format conversion from uVideoRec to AVWrapper
koda
parents: 11548
diff changeset
   451
        }
b7d5d75469ee Move pixel format conversion from uVideoRec to AVWrapper
koda
parents: 11548
diff changeset
   452
        buf += -stride;
b7d5d75469ee Move pixel format conversion from uVideoRec to AVWrapper
koda
parents: 11548
diff changeset
   453
        data[0] += g_pVFrame->linesize[0];
b7d5d75469ee Move pixel format conversion from uVideoRec to AVWrapper
koda
parents: 11548
diff changeset
   454
        if (y & 1) {
b7d5d75469ee Move pixel format conversion from uVideoRec to AVWrapper
koda
parents: 11548
diff changeset
   455
            data[1] += g_pVFrame->linesize[1];
b7d5d75469ee Move pixel format conversion from uVideoRec to AVWrapper
koda
parents: 11548
diff changeset
   456
            data[2] += g_pVFrame->linesize[2];
b7d5d75469ee Move pixel format conversion from uVideoRec to AVWrapper
koda
parents: 11548
diff changeset
   457
        }
b7d5d75469ee Move pixel format conversion from uVideoRec to AVWrapper
koda
parents: 11548
diff changeset
   458
    }
b7d5d75469ee Move pixel format conversion from uVideoRec to AVWrapper
koda
parents: 11548
diff changeset
   459
9925
113e61a8cadc Fixed avwrapper exit calls, fixing issue 752
Gianfranco Costamagna <costamagnagianfranco@yahoo.it>
parents: 9224
diff changeset
   460
    return WriteFrame(g_pVFrame);
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   461
}
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   462
9925
113e61a8cadc Fixed avwrapper exit calls, fixing issue 752
Gianfranco Costamagna <costamagnagianfranco@yahoo.it>
parents: 9224
diff changeset
   463
AVWRAP_DECL int AVWrapper_Init(
7198
5debd5fe526e 1. Add IFDEFs for video recording
Stepan777 <stepik-777@mail.ru>
parents: 7180
diff changeset
   464
         void (*pAddFileLogRaw)(const char*),
5debd5fe526e 1. Add IFDEFs for video recording
Stepan777 <stepik-777@mail.ru>
parents: 7180
diff changeset
   465
         const char* pFilename,
7280
fd707afbc3a2 pagevideos is now much better that before:
Stepan777 <stepik-777@mail.ru>
parents: 7235
diff changeset
   466
         const char* pDesc,
7198
5debd5fe526e 1. Add IFDEFs for video recording
Stepan777 <stepik-777@mail.ru>
parents: 7180
diff changeset
   467
         const char* pSoundFile,
5debd5fe526e 1. Add IFDEFs for video recording
Stepan777 <stepik-777@mail.ru>
parents: 7180
diff changeset
   468
         const char* pFormatName,
5debd5fe526e 1. Add IFDEFs for video recording
Stepan777 <stepik-777@mail.ru>
parents: 7180
diff changeset
   469
         const char* pVCodecName,
5debd5fe526e 1. Add IFDEFs for video recording
Stepan777 <stepik-777@mail.ru>
parents: 7180
diff changeset
   470
         const char* pACodecName,
5debd5fe526e 1. Add IFDEFs for video recording
Stepan777 <stepik-777@mail.ru>
parents: 7180
diff changeset
   471
         int Width, int Height,
5debd5fe526e 1. Add IFDEFs for video recording
Stepan777 <stepik-777@mail.ru>
parents: 7180
diff changeset
   472
         int FramerateNum, int FramerateDen,
7376
48b79b3ca592 rework saving of camera positions so there is no need to know framerate during prerecording.
Stepan777 <stepik-777@mail.ru>
parents: 7359
diff changeset
   473
         int VQuality)
8811
dcdfcddf37ee move avwraper compilation in its own folder
koda
parents: 8065
diff changeset
   474
{
9925
113e61a8cadc Fixed avwrapper exit calls, fixing issue 752
Gianfranco Costamagna <costamagnagianfranco@yahoo.it>
parents: 9224
diff changeset
   475
    int ret;
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   476
    AddFileLogRaw = pAddFileLogRaw;
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   477
    av_log_set_callback( &LogCallback );
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   478
7282
c65992e2d794 correctly fix odd dimensions (it was incorrectly fixed in previous commit)
Stepan777 <stepik-777@mail.ru>
parents: 7280
diff changeset
   479
    g_Width  = Width;
c65992e2d794 correctly fix odd dimensions (it was incorrectly fixed in previous commit)
Stepan777 <stepik-777@mail.ru>
parents: 7280
diff changeset
   480
    g_Height = Height;
7198
5debd5fe526e 1. Add IFDEFs for video recording
Stepan777 <stepik-777@mail.ru>
parents: 7180
diff changeset
   481
    g_Framerate.num = FramerateNum;
5debd5fe526e 1. Add IFDEFs for video recording
Stepan777 <stepik-777@mail.ru>
parents: 7180
diff changeset
   482
    g_Framerate.den = FramerateDen;
5debd5fe526e 1. Add IFDEFs for video recording
Stepan777 <stepik-777@mail.ru>
parents: 7180
diff changeset
   483
    g_VQuality = VQuality;
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   484
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   485
    // initialize libav and register all codecs and formats
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   486
    av_register_all();
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   487
7198
5debd5fe526e 1. Add IFDEFs for video recording
Stepan777 <stepik-777@mail.ru>
parents: 7180
diff changeset
   488
    // find format
5debd5fe526e 1. Add IFDEFs for video recording
Stepan777 <stepik-777@mail.ru>
parents: 7180
diff changeset
   489
    g_pFormat = av_guess_format(pFormatName, NULL, NULL);
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   490
    if (!g_pFormat)
9925
113e61a8cadc Fixed avwrapper exit calls, fixing issue 752
Gianfranco Costamagna <costamagnagianfranco@yahoo.it>
parents: 9224
diff changeset
   491
        return FatalError("Format \"%s\" was not found", pFormatName);
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   492
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   493
    // allocate the output media context
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   494
    g_pContainer = avformat_alloc_context();
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   495
    if (!g_pContainer)
9925
113e61a8cadc Fixed avwrapper exit calls, fixing issue 752
Gianfranco Costamagna <costamagnagianfranco@yahoo.it>
parents: 9224
diff changeset
   496
        return FatalError("Could not allocate output context");
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   497
7198
5debd5fe526e 1. Add IFDEFs for video recording
Stepan777 <stepik-777@mail.ru>
parents: 7180
diff changeset
   498
    g_pContainer->oformat = g_pFormat;
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   499
7280
fd707afbc3a2 pagevideos is now much better that before:
Stepan777 <stepik-777@mail.ru>
parents: 7235
diff changeset
   500
    // store description of file
fd707afbc3a2 pagevideos is now much better that before:
Stepan777 <stepik-777@mail.ru>
parents: 7235
diff changeset
   501
    av_dict_set(&g_pContainer->metadata, "comment", pDesc, 0);
fd707afbc3a2 pagevideos is now much better that before:
Stepan777 <stepik-777@mail.ru>
parents: 7235
diff changeset
   502
7198
5debd5fe526e 1. Add IFDEFs for video recording
Stepan777 <stepik-777@mail.ru>
parents: 7180
diff changeset
   503
    // append extesnion to filename
7235
baa69bd025d9 1. Implement new page in frontend with options for video recording.
Stepan777 <stepik-777@mail.ru>
parents: 7198
diff changeset
   504
    char ext[16];
baa69bd025d9 1. Implement new page in frontend with options for video recording.
Stepan777 <stepik-777@mail.ru>
parents: 7198
diff changeset
   505
    strncpy(ext, g_pFormat->extensions, 16);
baa69bd025d9 1. Implement new page in frontend with options for video recording.
Stepan777 <stepik-777@mail.ru>
parents: 7198
diff changeset
   506
    ext[15] = 0;
baa69bd025d9 1. Implement new page in frontend with options for video recording.
Stepan777 <stepik-777@mail.ru>
parents: 7198
diff changeset
   507
    ext[strcspn(ext,",")] = 0;
baa69bd025d9 1. Implement new page in frontend with options for video recording.
Stepan777 <stepik-777@mail.ru>
parents: 7198
diff changeset
   508
    snprintf(g_pContainer->filename, sizeof(g_pContainer->filename), "%s.%s", pFilename, ext);
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   509
7198
5debd5fe526e 1. Add IFDEFs for video recording
Stepan777 <stepik-777@mail.ru>
parents: 7180
diff changeset
   510
    // find codecs
5debd5fe526e 1. Add IFDEFs for video recording
Stepan777 <stepik-777@mail.ru>
parents: 7180
diff changeset
   511
    g_pVCodec = avcodec_find_encoder_by_name(pVCodecName);
5debd5fe526e 1. Add IFDEFs for video recording
Stepan777 <stepik-777@mail.ru>
parents: 7180
diff changeset
   512
    g_pACodec = avcodec_find_encoder_by_name(pACodecName);
5debd5fe526e 1. Add IFDEFs for video recording
Stepan777 <stepik-777@mail.ru>
parents: 7180
diff changeset
   513
5debd5fe526e 1. Add IFDEFs for video recording
Stepan777 <stepik-777@mail.ru>
parents: 7180
diff changeset
   514
    // add audio and video stream to container
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   515
    g_pVStream = NULL;
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   516
    g_pAStream = NULL;
7198
5debd5fe526e 1. Add IFDEFs for video recording
Stepan777 <stepik-777@mail.ru>
parents: 7180
diff changeset
   517
5debd5fe526e 1. Add IFDEFs for video recording
Stepan777 <stepik-777@mail.ru>
parents: 7180
diff changeset
   518
    if (g_pVCodec)
9925
113e61a8cadc Fixed avwrapper exit calls, fixing issue 752
Gianfranco Costamagna <costamagnagianfranco@yahoo.it>
parents: 9224
diff changeset
   519
    {
113e61a8cadc Fixed avwrapper exit calls, fixing issue 752
Gianfranco Costamagna <costamagnagianfranco@yahoo.it>
parents: 9224
diff changeset
   520
        ret = AddVideoStream();
113e61a8cadc Fixed avwrapper exit calls, fixing issue 752
Gianfranco Costamagna <costamagnagianfranco@yahoo.it>
parents: 9224
diff changeset
   521
        if (ret < 0)
113e61a8cadc Fixed avwrapper exit calls, fixing issue 752
Gianfranco Costamagna <costamagnagianfranco@yahoo.it>
parents: 9224
diff changeset
   522
            return ret;
113e61a8cadc Fixed avwrapper exit calls, fixing issue 752
Gianfranco Costamagna <costamagnagianfranco@yahoo.it>
parents: 9224
diff changeset
   523
    }
7198
5debd5fe526e 1. Add IFDEFs for video recording
Stepan777 <stepik-777@mail.ru>
parents: 7180
diff changeset
   524
    else
5debd5fe526e 1. Add IFDEFs for video recording
Stepan777 <stepik-777@mail.ru>
parents: 7180
diff changeset
   525
        Log("Video codec \"%s\" was not found; video will be ignored.\n", pVCodecName);
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   526
7198
5debd5fe526e 1. Add IFDEFs for video recording
Stepan777 <stepik-777@mail.ru>
parents: 7180
diff changeset
   527
    if (g_pACodec)
7280
fd707afbc3a2 pagevideos is now much better that before:
Stepan777 <stepik-777@mail.ru>
parents: 7235
diff changeset
   528
    {
fd707afbc3a2 pagevideos is now much better that before:
Stepan777 <stepik-777@mail.ru>
parents: 7235
diff changeset
   529
        g_pSoundFile = fopen(pSoundFile, "rb");
fd707afbc3a2 pagevideos is now much better that before:
Stepan777 <stepik-777@mail.ru>
parents: 7235
diff changeset
   530
        if (g_pSoundFile)
fd707afbc3a2 pagevideos is now much better that before:
Stepan777 <stepik-777@mail.ru>
parents: 7235
diff changeset
   531
        {
fd707afbc3a2 pagevideos is now much better that before:
Stepan777 <stepik-777@mail.ru>
parents: 7235
diff changeset
   532
            fread(&g_Frequency, 4, 1, g_pSoundFile);
fd707afbc3a2 pagevideos is now much better that before:
Stepan777 <stepik-777@mail.ru>
parents: 7235
diff changeset
   533
            fread(&g_Channels, 4, 1, g_pSoundFile);
fd707afbc3a2 pagevideos is now much better that before:
Stepan777 <stepik-777@mail.ru>
parents: 7235
diff changeset
   534
            AddAudioStream();
fd707afbc3a2 pagevideos is now much better that before:
Stepan777 <stepik-777@mail.ru>
parents: 7235
diff changeset
   535
        }
fd707afbc3a2 pagevideos is now much better that before:
Stepan777 <stepik-777@mail.ru>
parents: 7235
diff changeset
   536
        else
7306
3cff5c769509 Here they come - thumbnails.
Stepan777 <stepik-777@mail.ru>
parents: 7282
diff changeset
   537
            Log("Could not open %s\n", pSoundFile);
7280
fd707afbc3a2 pagevideos is now much better that before:
Stepan777 <stepik-777@mail.ru>
parents: 7235
diff changeset
   538
    }
7198
5debd5fe526e 1. Add IFDEFs for video recording
Stepan777 <stepik-777@mail.ru>
parents: 7180
diff changeset
   539
    else
5debd5fe526e 1. Add IFDEFs for video recording
Stepan777 <stepik-777@mail.ru>
parents: 7180
diff changeset
   540
        Log("Audio codec \"%s\" was not found; audio will be ignored.\n", pACodecName);
5debd5fe526e 1. Add IFDEFs for video recording
Stepan777 <stepik-777@mail.ru>
parents: 7180
diff changeset
   541
5debd5fe526e 1. Add IFDEFs for video recording
Stepan777 <stepik-777@mail.ru>
parents: 7180
diff changeset
   542
    if (!g_pAStream && !g_pVStream)
9925
113e61a8cadc Fixed avwrapper exit calls, fixing issue 752
Gianfranco Costamagna <costamagnagianfranco@yahoo.it>
parents: 9224
diff changeset
   543
        return FatalError("No video, no audio, aborting...");
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   544
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   545
    // write format info to log
7198
5debd5fe526e 1. Add IFDEFs for video recording
Stepan777 <stepik-777@mail.ru>
parents: 7180
diff changeset
   546
    av_dump_format(g_pContainer, 0, g_pContainer->filename, 1);
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   547
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   548
    // open the output file, if needed
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   549
    if (!(g_pFormat->flags & AVFMT_NOFILE))
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   550
    {
7198
5debd5fe526e 1. Add IFDEFs for video recording
Stepan777 <stepik-777@mail.ru>
parents: 7180
diff changeset
   551
        if (avio_open(&g_pContainer->pb, g_pContainer->filename, AVIO_FLAG_WRITE) < 0)
9925
113e61a8cadc Fixed avwrapper exit calls, fixing issue 752
Gianfranco Costamagna <costamagnagianfranco@yahoo.it>
parents: 9224
diff changeset
   552
            return FatalError("Could not open output file (%s)", g_pContainer->filename);
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   553
    }
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   554
11548
3617c611406b avwrapper: Do not ignore avformat_write_header return value
koda
parents: 11406
diff changeset
   555
    g_pVFrame->pts = -1;
7198
5debd5fe526e 1. Add IFDEFs for video recording
Stepan777 <stepik-777@mail.ru>
parents: 7180
diff changeset
   556
11548
3617c611406b avwrapper: Do not ignore avformat_write_header return value
koda
parents: 11406
diff changeset
   557
    // write the stream header, if any
3617c611406b avwrapper: Do not ignore avformat_write_header return value
koda
parents: 11406
diff changeset
   558
    return avformat_write_header(g_pContainer, NULL);
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   559
}
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   560
9925
113e61a8cadc Fixed avwrapper exit calls, fixing issue 752
Gianfranco Costamagna <costamagnagianfranco@yahoo.it>
parents: 9224
diff changeset
   561
AVWRAP_DECL int AVWrapper_Close()
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   562
{
9925
113e61a8cadc Fixed avwrapper exit calls, fixing issue 752
Gianfranco Costamagna <costamagnagianfranco@yahoo.it>
parents: 9224
diff changeset
   563
    int ret;
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   564
    // output buffered frames
11298
9fcdf0969d53 Update libav API, keeping forward and backward compatibility
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11046
diff changeset
   565
    if (g_pVCodec->capabilities & AV_CODEC_CAP_DELAY)
9925
113e61a8cadc Fixed avwrapper exit calls, fixing issue 752
Gianfranco Costamagna <costamagnagianfranco@yahoo.it>
parents: 9224
diff changeset
   566
    {
113e61a8cadc Fixed avwrapper exit calls, fixing issue 752
Gianfranco Costamagna <costamagnagianfranco@yahoo.it>
parents: 9224
diff changeset
   567
        do
113e61a8cadc Fixed avwrapper exit calls, fixing issue 752
Gianfranco Costamagna <costamagnagianfranco@yahoo.it>
parents: 9224
diff changeset
   568
            ret = WriteFrame(NULL);
11365
44248a9cdcac videorec: Fix flushing encoders
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11364
diff changeset
   569
        while (ret > 0);
9925
113e61a8cadc Fixed avwrapper exit calls, fixing issue 752
Gianfranco Costamagna <costamagnagianfranco@yahoo.it>
parents: 9224
diff changeset
   570
        if (ret < 0)
113e61a8cadc Fixed avwrapper exit calls, fixing issue 752
Gianfranco Costamagna <costamagnagianfranco@yahoo.it>
parents: 9224
diff changeset
   571
            return ret;
113e61a8cadc Fixed avwrapper exit calls, fixing issue 752
Gianfranco Costamagna <costamagnagianfranco@yahoo.it>
parents: 9224
diff changeset
   572
    }
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   573
    // output any remaining audio
9925
113e61a8cadc Fixed avwrapper exit calls, fixing issue 752
Gianfranco Costamagna <costamagnagianfranco@yahoo.it>
parents: 9224
diff changeset
   574
    do
113e61a8cadc Fixed avwrapper exit calls, fixing issue 752
Gianfranco Costamagna <costamagnagianfranco@yahoo.it>
parents: 9224
diff changeset
   575
    {
113e61a8cadc Fixed avwrapper exit calls, fixing issue 752
Gianfranco Costamagna <costamagnagianfranco@yahoo.it>
parents: 9224
diff changeset
   576
        ret = WriteAudioFrame();
113e61a8cadc Fixed avwrapper exit calls, fixing issue 752
Gianfranco Costamagna <costamagnagianfranco@yahoo.it>
parents: 9224
diff changeset
   577
    }
11365
44248a9cdcac videorec: Fix flushing encoders
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11364
diff changeset
   578
    while(ret > 0);
9925
113e61a8cadc Fixed avwrapper exit calls, fixing issue 752
Gianfranco Costamagna <costamagnagianfranco@yahoo.it>
parents: 9224
diff changeset
   579
    if (ret < 0)
113e61a8cadc Fixed avwrapper exit calls, fixing issue 752
Gianfranco Costamagna <costamagnagianfranco@yahoo.it>
parents: 9224
diff changeset
   580
        return ret;
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   581
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   582
    // write the trailer, if any.
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   583
    av_write_trailer(g_pContainer);
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   584
7198
5debd5fe526e 1. Add IFDEFs for video recording
Stepan777 <stepik-777@mail.ru>
parents: 7180
diff changeset
   585
    // close the output file
5debd5fe526e 1. Add IFDEFs for video recording
Stepan777 <stepik-777@mail.ru>
parents: 7180
diff changeset
   586
    if (!(g_pFormat->flags & AVFMT_NOFILE))
5debd5fe526e 1. Add IFDEFs for video recording
Stepan777 <stepik-777@mail.ru>
parents: 7180
diff changeset
   587
        avio_close(g_pContainer->pb);
5debd5fe526e 1. Add IFDEFs for video recording
Stepan777 <stepik-777@mail.ru>
parents: 7180
diff changeset
   588
5debd5fe526e 1. Add IFDEFs for video recording
Stepan777 <stepik-777@mail.ru>
parents: 7180
diff changeset
   589
    // free everything
5debd5fe526e 1. Add IFDEFs for video recording
Stepan777 <stepik-777@mail.ru>
parents: 7180
diff changeset
   590
    if (g_pVStream)
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   591
    {
7198
5debd5fe526e 1. Add IFDEFs for video recording
Stepan777 <stepik-777@mail.ru>
parents: 7180
diff changeset
   592
        avcodec_close(g_pVideo);
5debd5fe526e 1. Add IFDEFs for video recording
Stepan777 <stepik-777@mail.ru>
parents: 7180
diff changeset
   593
        av_free(g_pVideo);
5debd5fe526e 1. Add IFDEFs for video recording
Stepan777 <stepik-777@mail.ru>
parents: 7180
diff changeset
   594
        av_free(g_pVStream);
11298
9fcdf0969d53 Update libav API, keeping forward and backward compatibility
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11046
diff changeset
   595
        av_frame_free(&g_pVFrame);
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   596
    }
7198
5debd5fe526e 1. Add IFDEFs for video recording
Stepan777 <stepik-777@mail.ru>
parents: 7180
diff changeset
   597
    if (g_pAStream)
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   598
    {
7198
5debd5fe526e 1. Add IFDEFs for video recording
Stepan777 <stepik-777@mail.ru>
parents: 7180
diff changeset
   599
        avcodec_close(g_pAudio);
5debd5fe526e 1. Add IFDEFs for video recording
Stepan777 <stepik-777@mail.ru>
parents: 7180
diff changeset
   600
        av_free(g_pAudio);
5debd5fe526e 1. Add IFDEFs for video recording
Stepan777 <stepik-777@mail.ru>
parents: 7180
diff changeset
   601
        av_free(g_pAStream);
11298
9fcdf0969d53 Update libav API, keeping forward and backward compatibility
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11046
diff changeset
   602
        av_frame_free(&g_pAFrame);
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   603
        av_free(g_pSamples);
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   604
        fclose(g_pSoundFile);
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   605
    }
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   606
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   607
    av_free(g_pContainer);
9925
113e61a8cadc Fixed avwrapper exit calls, fixing issue 752
Gianfranco Costamagna <costamagnagianfranco@yahoo.it>
parents: 9224
diff changeset
   608
    return 0;
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   609
}