hedgewars/uVideoRec.pas
author Wuzzy <Wuzzy2@mail.ru>
Wed, 17 Jul 2019 00:33:55 +0200
changeset 15251 4aa19b21707d
parent 14957 8e4e508d153c
child 15272 22f2fd8a3d2c
permissions -rw-r--r--
Fix cursor not being disabled when teleporting hog into water
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
     1
(*
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
     2
 * Hedgewars, a free turn based strategy game
11046
47a8c19ecb60 more copyright fixes
sheepluva
parents: 10633
diff changeset
     3
 * Copyright (c) 2004-2015 Andrey Korotaev <unC0Rr@gmail.com>
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
     4
 *
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
     5
 * This program is free software; you can redistribute it and/or modify
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
     6
 * it under the terms of the GNU General Public License as published by
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
     7
 * the Free Software Foundation; version 2 of the License
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
     8
 *
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
     9
 * This program is distributed in the hope that it will be useful,
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
    12
 * GNU General Public License for more details.
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
    13
 *
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
    14
 * You should have received a copy of the GNU General Public License
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
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
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
    17
 *)
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
    18
7286
068adc6948e3 remaining IFDEFs
Stepan777 <stepik-777@mail.ru>
parents: 7280
diff changeset
    19
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
    20
{$INCLUDE "options.inc"}
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
    21
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
    22
unit uVideoRec;
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
    23
7286
068adc6948e3 remaining IFDEFs
Stepan777 <stepik-777@mail.ru>
parents: 7280
diff changeset
    24
{$IFNDEF USE_VIDEO_RECORDING}
068adc6948e3 remaining IFDEFs
Stepan777 <stepik-777@mail.ru>
parents: 7280
diff changeset
    25
interface
068adc6948e3 remaining IFDEFs
Stepan777 <stepik-777@mail.ru>
parents: 7280
diff changeset
    26
implementation
068adc6948e3 remaining IFDEFs
Stepan777 <stepik-777@mail.ru>
parents: 7280
diff changeset
    27
end.
068adc6948e3 remaining IFDEFs
Stepan777 <stepik-777@mail.ru>
parents: 7280
diff changeset
    28
{$ELSE}
068adc6948e3 remaining IFDEFs
Stepan777 <stepik-777@mail.ru>
parents: 7280
diff changeset
    29
14204
3c36a4e66c82 make engine windows checks work for 64bit builds
alfadur
parents: 13518
diff changeset
    30
{$IFNDEF WINDOWS}
8697
9624836094de fix linking on osx
koda
parents: 8666
diff changeset
    31
    {$linklib avwrapper}
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
    32
{$ENDIF}
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
    33
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
    34
interface
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
    35
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
    36
var flagPrerecording: boolean = false;
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
    37
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
    38
function BeginVideoRecording: Boolean;
14466
9844450389a4 Attempt to allow building video recording in pas2c mode, currently fails parsing
unc0rr
parents: 14204
diff changeset
    39
function LoadNextCameraPosition(var newRealTicks, newGameTicks: LongInt): Boolean;
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
    40
procedure EncodeFrame;
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
    41
procedure StopVideoRecording;
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
    42
7198
5debd5fe526e 1. Add IFDEFs for video recording
Stepan777 <stepik-777@mail.ru>
parents: 7180
diff changeset
    43
procedure BeginPreRecording;
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
    44
procedure StopPreRecording;
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
    45
procedure SaveCameraPosition;
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
    46
7850
fcbb024090a4 cleanup in initEverything and freeEverything
koda
parents: 7816
diff changeset
    47
procedure initModule;
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
    48
procedure freeModule;
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
    49
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
    50
implementation
14957
8e4e508d153c Use HaltFatalError for all VideoRec failures
Wuzzy <Wuzzy2@mail.ru>
parents: 14919
diff changeset
    51
uses uVariables, GLunit, SDLh, SysUtils, uUtils, uIO, uMisc, uTypes, uDebug;
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
    52
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
    53
type TAddFileLogRaw = procedure (s: pchar); cdecl;
8666
1652c1d9adc8 rework ffmpeg/libav/videorec linking and their cmake discovery
koda
parents: 8370
diff changeset
    54
const AvwrapperLibName = 'libavwrapper';
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
    55
9925
113e61a8cadc Fixed avwrapper exit calls, fixing issue 752
Gianfranco Costamagna <costamagnagianfranco@yahoo.it>
parents: 9545
diff changeset
    56
function AVWrapper_Init(
7198
5debd5fe526e 1. Add IFDEFs for video recording
Stepan777 <stepik-777@mail.ru>
parents: 7180
diff changeset
    57
              AddLog: TAddFileLogRaw;
7376
48b79b3ca592 rework saving of camera positions so there is no need to know framerate during prerecording.
Stepan777 <stepik-777@mail.ru>
parents: 7369
diff changeset
    58
              filename, desc, soundFile, format, vcodec, acodec: PChar;
9925
113e61a8cadc Fixed avwrapper exit calls, fixing issue 752
Gianfranco Costamagna <costamagnagianfranco@yahoo.it>
parents: 9545
diff changeset
    59
              width, height, framerateNum, framerateDen, vquality: LongInt): LongInt; cdecl; external AvwrapperLibName;
113e61a8cadc Fixed avwrapper exit calls, fixing issue 752
Gianfranco Costamagna <costamagnagianfranco@yahoo.it>
parents: 9545
diff changeset
    60
function AVWrapper_Close: LongInt; cdecl; external AvwrapperLibName;
11617
b7d5d75469ee Move pixel format conversion from uVideoRec to AVWrapper
koda
parents: 11537
diff changeset
    61
function AVWrapper_WriteFrame(rgb: PByte): LongInt; cdecl; external AvwrapperLibName;
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
    62
7280
fd707afbc3a2 pagevideos is now much better that before:
Stepan777 <stepik-777@mail.ru>
parents: 7235
diff changeset
    63
type TFrame = record
7376
48b79b3ca592 rework saving of camera positions so there is no need to know framerate during prerecording.
Stepan777 <stepik-777@mail.ru>
parents: 7369
diff changeset
    64
                  realTicks: LongWord;
48b79b3ca592 rework saving of camera positions so there is no need to know framerate during prerecording.
Stepan777 <stepik-777@mail.ru>
parents: 7369
diff changeset
    65
                  gameTicks: LongWord;
7280
fd707afbc3a2 pagevideos is now much better that before:
Stepan777 <stepik-777@mail.ru>
parents: 7235
diff changeset
    66
                  CamX, CamY: LongInt;
fd707afbc3a2 pagevideos is now much better that before:
Stepan777 <stepik-777@mail.ru>
parents: 7235
diff changeset
    67
                  zoom: single;
fd707afbc3a2 pagevideos is now much better that before:
Stepan777 <stepik-777@mail.ru>
parents: 7235
diff changeset
    68
              end;
fd707afbc3a2 pagevideos is now much better that before:
Stepan777 <stepik-777@mail.ru>
parents: 7235
diff changeset
    69
12626
d972b31f8881 fix some fpc hints
sheepluva
parents: 11826
diff changeset
    70
var RGB_Buffer: PByte;
14884
002f7d41f5ce VideoRec: Replace "File of" syntax to make Pas2C happy
Wuzzy <Wuzzy2@mail.ru>
parents: 14466
diff changeset
    71
    cameraFile: File;
14919
9ab78e08a34c Fix Pas2C unable to compile with VIDEOREC
Wuzzy <Wuzzy2@mail.ru>
parents: 14898
diff changeset
    72
    cameraFileName: shortstring;
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
    73
    audioFile: File;
7280
fd707afbc3a2 pagevideos is now much better that before:
Stepan777 <stepik-777@mail.ru>
parents: 7235
diff changeset
    74
    numPixels: LongWord;
7376
48b79b3ca592 rework saving of camera positions so there is no need to know framerate during prerecording.
Stepan777 <stepik-777@mail.ru>
parents: 7369
diff changeset
    75
    startTime, numFrames, curTime, progress, maxProgress: LongWord;
7392
bc3306c59a08 Correctly distinguish between game and real ticks while recording video,
Stepan777 <stepik-777@mail.ru>
parents: 7386
diff changeset
    76
    soundFilePath: shortstring;
13497
c7df0d96da81 Fix video recorder not working if sound disabled (fixes bug 200)
Wuzzy <Wuzzy2@mail.ru>
parents: 13231
diff changeset
    77
    thumbnailSaved: boolean;
c7df0d96da81 Fix video recorder not working if sound disabled (fixes bug 200)
Wuzzy <Wuzzy2@mail.ru>
parents: 13231
diff changeset
    78
    recordAudio: boolean;
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
    79
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
    80
function BeginVideoRecording: Boolean;
7280
fd707afbc3a2 pagevideos is now much better that before:
Stepan777 <stepik-777@mail.ru>
parents: 7235
diff changeset
    81
var filename, desc: shortstring;
14919
9ab78e08a34c Fix Pas2C unable to compile with VIDEOREC
Wuzzy <Wuzzy2@mail.ru>
parents: 14898
diff changeset
    82
    filenameA, descA, soundFilePathA, cAVFormatA, cVideoCodecA, cAudioCodecA: ansistring;
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
    83
begin
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
    84
    AddFileLog('BeginVideoRecording');
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
    85
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
    86
{$IOCHECKS OFF}
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
    87
    // open file with prerecorded camera positions
14919
9ab78e08a34c Fix Pas2C unable to compile with VIDEOREC
Wuzzy <Wuzzy2@mail.ru>
parents: 14898
diff changeset
    88
    cameraFileName:= shortstring(UserPathPrefix) + '/VideoTemp/' + shortstring(RecPrefix) + '.txtin';
9ab78e08a34c Fix Pas2C unable to compile with VIDEOREC
Wuzzy <Wuzzy2@mail.ru>
parents: 14898
diff changeset
    89
    Assign(cameraFile, cameraFileName);
14884
002f7d41f5ce VideoRec: Replace "File of" syntax to make Pas2C happy
Wuzzy <Wuzzy2@mail.ru>
parents: 14466
diff changeset
    90
    Reset(cameraFile, SizeOf(TFrame));
7376
48b79b3ca592 rework saving of camera positions so there is no need to know framerate during prerecording.
Stepan777 <stepik-777@mail.ru>
parents: 7369
diff changeset
    91
    maxProgress:= FileSize(cameraFile);
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
    92
    if IOResult <> 0 then
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
    93
    begin
14919
9ab78e08a34c Fix Pas2C unable to compile with VIDEOREC
Wuzzy <Wuzzy2@mail.ru>
parents: 14898
diff changeset
    94
        AddFileLog('Error: Could not read from ' + cameraFileName);
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
    95
        exit(false);
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
    96
    end;
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
    97
{$IOCHECKS ON}
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
    98
13231
4028d7f85233 Make video metadata strings translatable in frontend
Wuzzy <Wuzzy2@mail.ru>
parents: 12626
diff changeset
    99
    { Store some description in output file.
4028d7f85233 Make video metadata strings translatable in frontend
Wuzzy <Wuzzy2@mail.ru>
parents: 12626
diff changeset
   100
    The comment must follow a particular format and must be in English.
4028d7f85233 Make video metadata strings translatable in frontend
Wuzzy <Wuzzy2@mail.ru>
parents: 12626
diff changeset
   101
    This will be parsed by the frontend.
4028d7f85233 Make video metadata strings translatable in frontend
Wuzzy <Wuzzy2@mail.ru>
parents: 12626
diff changeset
   102
    The frontend will parse lines of this format:
4028d7f85233 Make video metadata strings translatable in frontend
Wuzzy <Wuzzy2@mail.ru>
parents: 12626
diff changeset
   103
        Key: Value
4028d7f85233 Make video metadata strings translatable in frontend
Wuzzy <Wuzzy2@mail.ru>
parents: 12626
diff changeset
   104
    The key names will be localized in the frontend.
4028d7f85233 Make video metadata strings translatable in frontend
Wuzzy <Wuzzy2@mail.ru>
parents: 12626
diff changeset
   105
    If you add a key/value pair, don't forget to add a localization
4028d7f85233 Make video metadata strings translatable in frontend
Wuzzy <Wuzzy2@mail.ru>
parents: 12626
diff changeset
   106
    in the frontend! }
7280
fd707afbc3a2 pagevideos is now much better that before:
Stepan777 <stepik-777@mail.ru>
parents: 7235
diff changeset
   107
    desc:= '';
fd707afbc3a2 pagevideos is now much better that before:
Stepan777 <stepik-777@mail.ru>
parents: 7235
diff changeset
   108
    if UserNick <> '' then
7804
9122461ae32b Get rid of C-style operators
unc0rr
parents: 7671
diff changeset
   109
        desc:= desc + 'Player: ' + UserNick + #10;
7280
fd707afbc3a2 pagevideos is now much better that before:
Stepan777 <stepik-777@mail.ru>
parents: 7235
diff changeset
   110
    if recordFileName <> '' then
7804
9122461ae32b Get rid of C-style operators
unc0rr
parents: 7671
diff changeset
   111
        desc:= desc + 'Record: ' + recordFileName + #10;
7280
fd707afbc3a2 pagevideos is now much better that before:
Stepan777 <stepik-777@mail.ru>
parents: 7235
diff changeset
   112
    if cMapName <> '' then
7804
9122461ae32b Get rid of C-style operators
unc0rr
parents: 7671
diff changeset
   113
        desc:= desc + 'Map: ' + cMapName + #10;
7280
fd707afbc3a2 pagevideos is now much better that before:
Stepan777 <stepik-777@mail.ru>
parents: 7235
diff changeset
   114
    if Theme <> '' then
7804
9122461ae32b Get rid of C-style operators
unc0rr
parents: 7671
diff changeset
   115
        desc:= desc + 'Theme: ' + Theme + #10;
9122461ae32b Get rid of C-style operators
unc0rr
parents: 7671
diff changeset
   116
    desc:= desc + 'prefix[' + RecPrefix + ']prefix';
9122461ae32b Get rid of C-style operators
unc0rr
parents: 7671
diff changeset
   117
14898
66b510a8b81c Pas2C: Fix path concatenation in uVideoRec
Wuzzy <Wuzzy2@mail.ru>
parents: 14892
diff changeset
   118
    filename:= shortstring(UserPathPrefix) + '/VideoTemp/' + shortstring(RecPrefix);
13497
c7df0d96da81 Fix video recorder not working if sound disabled (fixes bug 200)
Wuzzy <Wuzzy2@mail.ru>
parents: 13231
diff changeset
   119
c7df0d96da81 Fix video recorder not working if sound disabled (fixes bug 200)
Wuzzy <Wuzzy2@mail.ru>
parents: 13231
diff changeset
   120
    recordAudio:= (cAudioCodec <> 'no');
c7df0d96da81 Fix video recorder not working if sound disabled (fixes bug 200)
Wuzzy <Wuzzy2@mail.ru>
parents: 13231
diff changeset
   121
    if recordAudio then
14898
66b510a8b81c Pas2C: Fix path concatenation in uVideoRec
Wuzzy <Wuzzy2@mail.ru>
parents: 14892
diff changeset
   122
        soundFilePath:= shortstring(UserPathPrefix) + '/VideoTemp/' + shortstring(RecPrefix) + '.sw'
13497
c7df0d96da81 Fix video recorder not working if sound disabled (fixes bug 200)
Wuzzy <Wuzzy2@mail.ru>
parents: 13231
diff changeset
   123
    else
c7df0d96da81 Fix video recorder not working if sound disabled (fixes bug 200)
Wuzzy <Wuzzy2@mail.ru>
parents: 13231
diff changeset
   124
        soundFilePath:= '';
7280
fd707afbc3a2 pagevideos is now much better that before:
Stepan777 <stepik-777@mail.ru>
parents: 7235
diff changeset
   125
14919
9ab78e08a34c Fix Pas2C unable to compile with VIDEOREC
Wuzzy <Wuzzy2@mail.ru>
parents: 14898
diff changeset
   126
    filenameA:= ansistring(filename);
9ab78e08a34c Fix Pas2C unable to compile with VIDEOREC
Wuzzy <Wuzzy2@mail.ru>
parents: 14898
diff changeset
   127
    descA:= ansistring(desc);
9ab78e08a34c Fix Pas2C unable to compile with VIDEOREC
Wuzzy <Wuzzy2@mail.ru>
parents: 14898
diff changeset
   128
    soundFilePathA:= ansistring(soundFilePath);
9ab78e08a34c Fix Pas2C unable to compile with VIDEOREC
Wuzzy <Wuzzy2@mail.ru>
parents: 14898
diff changeset
   129
    cAVFormatA:= ansistring(cAVFormat);
9ab78e08a34c Fix Pas2C unable to compile with VIDEOREC
Wuzzy <Wuzzy2@mail.ru>
parents: 14898
diff changeset
   130
    cVideoCodecA:= ansistring(cVideoCodec);
9ab78e08a34c Fix Pas2C unable to compile with VIDEOREC
Wuzzy <Wuzzy2@mail.ru>
parents: 14898
diff changeset
   131
    cAudioCodecA:= ansistring(cAudioCodec);
11537
bf86c6cb9341 Bye-bye TryDo
unc0rr
parents: 11046
diff changeset
   132
    if checkFails(AVWrapper_Init(@AddFileLogRaw
14919
9ab78e08a34c Fix Pas2C unable to compile with VIDEOREC
Wuzzy <Wuzzy2@mail.ru>
parents: 14898
diff changeset
   133
        , PChar(filenameA)
9ab78e08a34c Fix Pas2C unable to compile with VIDEOREC
Wuzzy <Wuzzy2@mail.ru>
parents: 14898
diff changeset
   134
        , PChar(descA)
9ab78e08a34c Fix Pas2C unable to compile with VIDEOREC
Wuzzy <Wuzzy2@mail.ru>
parents: 14898
diff changeset
   135
        , PChar(soundFilePathA)
9ab78e08a34c Fix Pas2C unable to compile with VIDEOREC
Wuzzy <Wuzzy2@mail.ru>
parents: 14898
diff changeset
   136
        , PChar(cAVFormatA)
9ab78e08a34c Fix Pas2C unable to compile with VIDEOREC
Wuzzy <Wuzzy2@mail.ru>
parents: 14898
diff changeset
   137
        , PChar(cVideoCodecA)
9ab78e08a34c Fix Pas2C unable to compile with VIDEOREC
Wuzzy <Wuzzy2@mail.ru>
parents: 14898
diff changeset
   138
        , PChar(cAudioCodecA)
10309
e338ccbbe100 fix videorec build
sheepluva
parents: 10306
diff changeset
   139
        , cScreenWidth, cScreenHeight, cVideoFramerateNum, cVideoFramerateDen, cVideoQuality) >= 0,
e338ccbbe100 fix videorec build
sheepluva
parents: 10306
diff changeset
   140
        'AVWrapper_Init failed',
11537
bf86c6cb9341 Bye-bye TryDo
unc0rr
parents: 11046
diff changeset
   141
        true) then exit(false);
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   142
7376
48b79b3ca592 rework saving of camera positions so there is no need to know framerate during prerecording.
Stepan777 <stepik-777@mail.ru>
parents: 7369
diff changeset
   143
    numPixels:= cScreenWidth*cScreenHeight;
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   144
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   145
    RGB_Buffer:= GetMem(4*numPixels);
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   146
    if RGB_Buffer = nil then
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   147
    begin
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   148
        AddFileLog('Error: Could not allocate memory for video recording (RGB buffer).');
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   149
        exit(false);
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   150
    end;
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   151
7376
48b79b3ca592 rework saving of camera positions so there is no need to know framerate during prerecording.
Stepan777 <stepik-777@mail.ru>
parents: 7369
diff changeset
   152
    curTime:= 0;
48b79b3ca592 rework saving of camera positions so there is no need to know framerate during prerecording.
Stepan777 <stepik-777@mail.ru>
parents: 7369
diff changeset
   153
    numFrames:= 0;
48b79b3ca592 rework saving of camera positions so there is no need to know framerate during prerecording.
Stepan777 <stepik-777@mail.ru>
parents: 7369
diff changeset
   154
    progress:= 0;
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   155
    BeginVideoRecording:= true;
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   156
end;
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   157
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   158
procedure StopVideoRecording;
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   159
begin
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   160
    AddFileLog('StopVideoRecording');
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   161
    FreeMem(RGB_Buffer, 4*numPixels);
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   162
    Close(cameraFile);
9925
113e61a8cadc Fixed avwrapper exit calls, fixing issue 752
Gianfranco Costamagna <costamagnagianfranco@yahoo.it>
parents: 9545
diff changeset
   163
    if AVWrapper_Close() < 0 then
13500
b5f8864a38d3 Add proper exit codes when halt-ing hwengine due to error
Wuzzy <Wuzzy2@mail.ru>
parents: 13498
diff changeset
   164
        begin
14957
8e4e508d153c Use HaltFatalError for all VideoRec failures
Wuzzy <Wuzzy2@mail.ru>
parents: 14919
diff changeset
   165
        OutError('AVWrapper_Close() has failed.', true);
13500
b5f8864a38d3 Add proper exit codes when halt-ing hwengine due to error
Wuzzy <Wuzzy2@mail.ru>
parents: 13498
diff changeset
   166
        end;
13518
d8462cc9d42d Fix engine crash when trying to delete cameraFile but it doesn't exist
Wuzzy <Wuzzy2@mail.ru>
parents: 13500
diff changeset
   167
{$IOCHECKS OFF}
14919
9ab78e08a34c Fix Pas2C unable to compile with VIDEOREC
Wuzzy <Wuzzy2@mail.ru>
parents: 14898
diff changeset
   168
    if FileExists(cameraFileName) then
9ab78e08a34c Fix Pas2C unable to compile with VIDEOREC
Wuzzy <Wuzzy2@mail.ru>
parents: 14898
diff changeset
   169
        DeleteFile(cameraFileName)
13518
d8462cc9d42d Fix engine crash when trying to delete cameraFile but it doesn't exist
Wuzzy <Wuzzy2@mail.ru>
parents: 13500
diff changeset
   170
    else
d8462cc9d42d Fix engine crash when trying to delete cameraFile but it doesn't exist
Wuzzy <Wuzzy2@mail.ru>
parents: 13500
diff changeset
   171
        AddFileLog('Warning: Tried to delete the cameraFile but it was already deleted');
d8462cc9d42d Fix engine crash when trying to delete cameraFile but it doesn't exist
Wuzzy <Wuzzy2@mail.ru>
parents: 13500
diff changeset
   172
{$IOCHECKS ON}
d8462cc9d42d Fix engine crash when trying to delete cameraFile but it doesn't exist
Wuzzy <Wuzzy2@mail.ru>
parents: 13500
diff changeset
   173
    if recordAudio and FileExists(soundFilePath) then
13497
c7df0d96da81 Fix video recorder not working if sound disabled (fixes bug 200)
Wuzzy <Wuzzy2@mail.ru>
parents: 13231
diff changeset
   174
        DeleteFile(soundFilePath);
7376
48b79b3ca592 rework saving of camera positions so there is no need to know framerate during prerecording.
Stepan777 <stepik-777@mail.ru>
parents: 7369
diff changeset
   175
    SendIPC(_S'v'); // inform frontend that we finished
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   176
end;
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   177
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   178
procedure EncodeFrame;
11617
b7d5d75469ee Move pixel format conversion from uVideoRec to AVWrapper
koda
parents: 11537
diff changeset
   179
var s: shortstring;
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   180
begin
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   181
    // read pixels from OpenGL
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   182
    glReadPixels(0, 0, cScreenWidth, cScreenHeight, GL_RGBA, GL_UNSIGNED_BYTE, RGB_Buffer);
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   183
11617
b7d5d75469ee Move pixel format conversion from uVideoRec to AVWrapper
koda
parents: 11537
diff changeset
   184
    if AVWrapper_WriteFrame(RGB_Buffer) < 0 then
13500
b5f8864a38d3 Add proper exit codes when halt-ing hwengine due to error
Wuzzy <Wuzzy2@mail.ru>
parents: 13498
diff changeset
   185
        begin
14957
8e4e508d153c Use HaltFatalError for all VideoRec failures
Wuzzy <Wuzzy2@mail.ru>
parents: 14919
diff changeset
   186
        OutError('AVWrapper_WriteFrame(RGB_Buffer) has failed.', true);
13500
b5f8864a38d3 Add proper exit codes when halt-ing hwengine due to error
Wuzzy <Wuzzy2@mail.ru>
parents: 13498
diff changeset
   187
        end;
7280
fd707afbc3a2 pagevideos is now much better that before:
Stepan777 <stepik-777@mail.ru>
parents: 7235
diff changeset
   188
7376
48b79b3ca592 rework saving of camera positions so there is no need to know framerate during prerecording.
Stepan777 <stepik-777@mail.ru>
parents: 7369
diff changeset
   189
    // inform frontend that we have encoded new frame
48b79b3ca592 rework saving of camera positions so there is no need to know framerate during prerecording.
Stepan777 <stepik-777@mail.ru>
parents: 7369
diff changeset
   190
    s[0]:= #3;
48b79b3ca592 rework saving of camera positions so there is no need to know framerate during prerecording.
Stepan777 <stepik-777@mail.ru>
parents: 7369
diff changeset
   191
    s[1]:= 'p'; // p for progress
48b79b3ca592 rework saving of camera positions so there is no need to know framerate during prerecording.
Stepan777 <stepik-777@mail.ru>
parents: 7369
diff changeset
   192
    SDLNet_Write16(progress*10000 div maxProgress, @s[2]);
48b79b3ca592 rework saving of camera positions so there is no need to know framerate during prerecording.
Stepan777 <stepik-777@mail.ru>
parents: 7369
diff changeset
   193
    SendIPC(s);
48b79b3ca592 rework saving of camera positions so there is no need to know framerate during prerecording.
Stepan777 <stepik-777@mail.ru>
parents: 7369
diff changeset
   194
    inc(numFrames);
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   195
end;
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   196
14466
9844450389a4 Attempt to allow building video recording in pas2c mode, currently fails parsing
unc0rr
parents: 14204
diff changeset
   197
function LoadNextCameraPosition(var newRealTicks, newGameTicks: LongInt): Boolean;
8370
0c79946e96f8 Fix tons of warnings
martin_bede
parents: 8279
diff changeset
   198
var frame: TFrame = (realTicks: 0; gameTicks: 0; CamX: 0; CamY: 0; zoom: 0);
14919
9ab78e08a34c Fix Pas2C unable to compile with VIDEOREC
Wuzzy <Wuzzy2@mail.ru>
parents: 14898
diff changeset
   199
    res: LongInt;
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   200
begin
7376
48b79b3ca592 rework saving of camera positions so there is no need to know framerate during prerecording.
Stepan777 <stepik-777@mail.ru>
parents: 7369
diff changeset
   201
    // we need to skip or duplicate frames to match target framerate
7379
aa29a2f16cc7 fix bug with desynced camera positions
Stepan777 <stepik-777@mail.ru>
parents: 7376
diff changeset
   202
    while Int64(curTime)*cVideoFramerateNum <= Int64(numFrames)*cVideoFramerateDen*1000 do
7376
48b79b3ca592 rework saving of camera positions so there is no need to know framerate during prerecording.
Stepan777 <stepik-777@mail.ru>
parents: 7369
diff changeset
   203
    begin
14919
9ab78e08a34c Fix Pas2C unable to compile with VIDEOREC
Wuzzy <Wuzzy2@mail.ru>
parents: 14898
diff changeset
   204
    res:= 0;
7376
48b79b3ca592 rework saving of camera positions so there is no need to know framerate during prerecording.
Stepan777 <stepik-777@mail.ru>
parents: 7369
diff changeset
   205
    {$IOCHECKS OFF}
48b79b3ca592 rework saving of camera positions so there is no need to know framerate during prerecording.
Stepan777 <stepik-777@mail.ru>
parents: 7369
diff changeset
   206
        if eof(cameraFile) then
7392
bc3306c59a08 Correctly distinguish between game and real ticks while recording video,
Stepan777 <stepik-777@mail.ru>
parents: 7386
diff changeset
   207
            exit(false);
14919
9ab78e08a34c Fix Pas2C unable to compile with VIDEOREC
Wuzzy <Wuzzy2@mail.ru>
parents: 14898
diff changeset
   208
        BlockRead(cameraFile, frame, 1, res);
7376
48b79b3ca592 rework saving of camera positions so there is no need to know framerate during prerecording.
Stepan777 <stepik-777@mail.ru>
parents: 7369
diff changeset
   209
    {$IOCHECKS ON}
48b79b3ca592 rework saving of camera positions so there is no need to know framerate during prerecording.
Stepan777 <stepik-777@mail.ru>
parents: 7369
diff changeset
   210
        curTime:= frame.realTicks;
48b79b3ca592 rework saving of camera positions so there is no need to know framerate during prerecording.
Stepan777 <stepik-777@mail.ru>
parents: 7369
diff changeset
   211
        WorldDx:= frame.CamX;
48b79b3ca592 rework saving of camera positions so there is no need to know framerate during prerecording.
Stepan777 <stepik-777@mail.ru>
parents: 7369
diff changeset
   212
        WorldDy:= frame.CamY + cScreenHeight div 2;
48b79b3ca592 rework saving of camera positions so there is no need to know framerate during prerecording.
Stepan777 <stepik-777@mail.ru>
parents: 7369
diff changeset
   213
        zoom:= frame.zoom*cScreenWidth;
48b79b3ca592 rework saving of camera positions so there is no need to know framerate during prerecording.
Stepan777 <stepik-777@mail.ru>
parents: 7369
diff changeset
   214
        ZoomValue:= zoom;
48b79b3ca592 rework saving of camera positions so there is no need to know framerate during prerecording.
Stepan777 <stepik-777@mail.ru>
parents: 7369
diff changeset
   215
        inc(progress);
7392
bc3306c59a08 Correctly distinguish between game and real ticks while recording video,
Stepan777 <stepik-777@mail.ru>
parents: 7386
diff changeset
   216
        newRealTicks:= frame.realTicks;
bc3306c59a08 Correctly distinguish between game and real ticks while recording video,
Stepan777 <stepik-777@mail.ru>
parents: 7386
diff changeset
   217
        newGameTicks:= frame.gameTicks;
7376
48b79b3ca592 rework saving of camera positions so there is no need to know framerate during prerecording.
Stepan777 <stepik-777@mail.ru>
parents: 7369
diff changeset
   218
    end;
7392
bc3306c59a08 Correctly distinguish between game and real ticks while recording video,
Stepan777 <stepik-777@mail.ru>
parents: 7386
diff changeset
   219
    LoadNextCameraPosition:= true;
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   220
end;
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   221
7235
baa69bd025d9 1. Implement new page in frontend with options for video recording.
Stepan777 <stepik-777@mail.ru>
parents: 7198
diff changeset
   222
// Callback which records sound.
baa69bd025d9 1. Implement new page in frontend with options for video recording.
Stepan777 <stepik-777@mail.ru>
parents: 7198
diff changeset
   223
// This procedure may be called from different thread.
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   224
procedure RecordPostMix(udata: pointer; stream: PByte; len: LongInt); cdecl;
14919
9ab78e08a34c Fix Pas2C unable to compile with VIDEOREC
Wuzzy <Wuzzy2@mail.ru>
parents: 14898
diff changeset
   225
var result: LongInt;
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   226
begin
14919
9ab78e08a34c Fix Pas2C unable to compile with VIDEOREC
Wuzzy <Wuzzy2@mail.ru>
parents: 14898
diff changeset
   227
    result:= 0; // avoid warning
7235
baa69bd025d9 1. Implement new page in frontend with options for video recording.
Stepan777 <stepik-777@mail.ru>
parents: 7198
diff changeset
   228
    udata:= udata; // avoid warning
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   229
{$IOCHECKS OFF}
14919
9ab78e08a34c Fix Pas2C unable to compile with VIDEOREC
Wuzzy <Wuzzy2@mail.ru>
parents: 14898
diff changeset
   230
    BlockWrite(audioFile, stream^, len, result);
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   231
{$IOCHECKS ON}
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   232
end;
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   233
7306
3cff5c769509 Here they come - thumbnails.
Stepan777 <stepik-777@mail.ru>
parents: 7286
diff changeset
   234
procedure SaveThumbnail;
3cff5c769509 Here they come - thumbnails.
Stepan777 <stepik-777@mail.ru>
parents: 7286
diff changeset
   235
var thumbpath: shortstring;
3cff5c769509 Here they come - thumbnails.
Stepan777 <stepik-777@mail.ru>
parents: 7286
diff changeset
   236
    k: LongInt;
3cff5c769509 Here they come - thumbnails.
Stepan777 <stepik-777@mail.ru>
parents: 7286
diff changeset
   237
begin
14892
a414d37278df Move video thumbnails to VideoThumbnails/, fix video renaming not renaming the thumbnail as well
Wuzzy <Wuzzy2@mail.ru>
parents: 14884
diff changeset
   238
    thumbpath:= '/VideoThumbnails/' + RecPrefix;
7306
3cff5c769509 Here they come - thumbnails.
Stepan777 <stepik-777@mail.ru>
parents: 7286
diff changeset
   239
    AddFileLog('Saving thumbnail ' + thumbpath);
7386
e82a076df09b Fix bug with isInLag picture displayed at end of some videos.
Stepan777 <stepik-777@mail.ru>
parents: 7379
diff changeset
   240
    k:= max(max(cScreenWidth, cScreenHeight) div 400, 1); // here 400 is minimum size of thumbnail
10633
2f062fac5791 Add that "make screenshots of Land/LandPixels" thing for map creators
nemo
parents: 10309
diff changeset
   241
    MakeScreenshot(thumbpath, k, 0);
7306
3cff5c769509 Here they come - thumbnails.
Stepan777 <stepik-777@mail.ru>
parents: 7286
diff changeset
   242
    thumbnailSaved:= true;
3cff5c769509 Here they come - thumbnails.
Stepan777 <stepik-777@mail.ru>
parents: 7286
diff changeset
   243
end;
3cff5c769509 Here they come - thumbnails.
Stepan777 <stepik-777@mail.ru>
parents: 7286
diff changeset
   244
7392
bc3306c59a08 Correctly distinguish between game and real ticks while recording video,
Stepan777 <stepik-777@mail.ru>
parents: 7386
diff changeset
   245
// copy file (free pascal doesn't have copy file function)
bc3306c59a08 Correctly distinguish between game and real ticks while recording video,
Stepan777 <stepik-777@mail.ru>
parents: 7386
diff changeset
   246
procedure CopyFile(src, dest: shortstring);
bc3306c59a08 Correctly distinguish between game and real ticks while recording video,
Stepan777 <stepik-777@mail.ru>
parents: 7386
diff changeset
   247
var inF, outF: file;
bc3306c59a08 Correctly distinguish between game and real ticks while recording video,
Stepan777 <stepik-777@mail.ru>
parents: 7386
diff changeset
   248
    buffer: array[0..1023] of byte;
14919
9ab78e08a34c Fix Pas2C unable to compile with VIDEOREC
Wuzzy <Wuzzy2@mail.ru>
parents: 14898
diff changeset
   249
    result, result2: LongInt;
8370
0c79946e96f8 Fix tons of warnings
martin_bede
parents: 8279
diff changeset
   250
    i: integer;
7392
bc3306c59a08 Correctly distinguish between game and real ticks while recording video,
Stepan777 <stepik-777@mail.ru>
parents: 7386
diff changeset
   251
begin
bc3306c59a08 Correctly distinguish between game and real ticks while recording video,
Stepan777 <stepik-777@mail.ru>
parents: 7386
diff changeset
   252
{$IOCHECKS OFF}
8370
0c79946e96f8 Fix tons of warnings
martin_bede
parents: 8279
diff changeset
   253
    result:= 0; // avoid compiler hint and warning
14919
9ab78e08a34c Fix Pas2C unable to compile with VIDEOREC
Wuzzy <Wuzzy2@mail.ru>
parents: 14898
diff changeset
   254
    result2:= 0; // avoid compiler hint and warning
8370
0c79946e96f8 Fix tons of warnings
martin_bede
parents: 8279
diff changeset
   255
    for i:= 0 to 1023 do
0c79946e96f8 Fix tons of warnings
martin_bede
parents: 8279
diff changeset
   256
        buffer[i]:= 0;
7392
bc3306c59a08 Correctly distinguish between game and real ticks while recording video,
Stepan777 <stepik-777@mail.ru>
parents: 7386
diff changeset
   257
bc3306c59a08 Correctly distinguish between game and real ticks while recording video,
Stepan777 <stepik-777@mail.ru>
parents: 7386
diff changeset
   258
    Assign(inF, src);
bc3306c59a08 Correctly distinguish between game and real ticks while recording video,
Stepan777 <stepik-777@mail.ru>
parents: 7386
diff changeset
   259
    Reset(inF, 1);
bc3306c59a08 Correctly distinguish between game and real ticks while recording video,
Stepan777 <stepik-777@mail.ru>
parents: 7386
diff changeset
   260
    if IOResult <> 0 then
bc3306c59a08 Correctly distinguish between game and real ticks while recording video,
Stepan777 <stepik-777@mail.ru>
parents: 7386
diff changeset
   261
    begin
bc3306c59a08 Correctly distinguish between game and real ticks while recording video,
Stepan777 <stepik-777@mail.ru>
parents: 7386
diff changeset
   262
        AddFileLog('Error: Could not read from ' + src);
bc3306c59a08 Correctly distinguish between game and real ticks while recording video,
Stepan777 <stepik-777@mail.ru>
parents: 7386
diff changeset
   263
        exit;
bc3306c59a08 Correctly distinguish between game and real ticks while recording video,
Stepan777 <stepik-777@mail.ru>
parents: 7386
diff changeset
   264
    end;
bc3306c59a08 Correctly distinguish between game and real ticks while recording video,
Stepan777 <stepik-777@mail.ru>
parents: 7386
diff changeset
   265
bc3306c59a08 Correctly distinguish between game and real ticks while recording video,
Stepan777 <stepik-777@mail.ru>
parents: 7386
diff changeset
   266
    Assign(outF, dest);
bc3306c59a08 Correctly distinguish between game and real ticks while recording video,
Stepan777 <stepik-777@mail.ru>
parents: 7386
diff changeset
   267
    Rewrite(outF, 1);
bc3306c59a08 Correctly distinguish between game and real ticks while recording video,
Stepan777 <stepik-777@mail.ru>
parents: 7386
diff changeset
   268
    if IOResult <> 0 then
bc3306c59a08 Correctly distinguish between game and real ticks while recording video,
Stepan777 <stepik-777@mail.ru>
parents: 7386
diff changeset
   269
    begin
bc3306c59a08 Correctly distinguish between game and real ticks while recording video,
Stepan777 <stepik-777@mail.ru>
parents: 7386
diff changeset
   270
        AddFileLog('Error: Could not write to ' + dest);
bc3306c59a08 Correctly distinguish between game and real ticks while recording video,
Stepan777 <stepik-777@mail.ru>
parents: 7386
diff changeset
   271
        exit;
bc3306c59a08 Correctly distinguish between game and real ticks while recording video,
Stepan777 <stepik-777@mail.ru>
parents: 7386
diff changeset
   272
    end;
bc3306c59a08 Correctly distinguish between game and real ticks while recording video,
Stepan777 <stepik-777@mail.ru>
parents: 7386
diff changeset
   273
bc3306c59a08 Correctly distinguish between game and real ticks while recording video,
Stepan777 <stepik-777@mail.ru>
parents: 7386
diff changeset
   274
    repeat
bc3306c59a08 Correctly distinguish between game and real ticks while recording video,
Stepan777 <stepik-777@mail.ru>
parents: 7386
diff changeset
   275
        BlockRead(inF, buffer, 1024, result);
14919
9ab78e08a34c Fix Pas2C unable to compile with VIDEOREC
Wuzzy <Wuzzy2@mail.ru>
parents: 14898
diff changeset
   276
        BlockWrite(outF, buffer, result, result2);
7392
bc3306c59a08 Correctly distinguish between game and real ticks while recording video,
Stepan777 <stepik-777@mail.ru>
parents: 7386
diff changeset
   277
    until result < 1024;
bc3306c59a08 Correctly distinguish between game and real ticks while recording video,
Stepan777 <stepik-777@mail.ru>
parents: 7386
diff changeset
   278
{$IOCHECKS ON}
bc3306c59a08 Correctly distinguish between game and real ticks while recording video,
Stepan777 <stepik-777@mail.ru>
parents: 7386
diff changeset
   279
end;
bc3306c59a08 Correctly distinguish between game and real ticks while recording video,
Stepan777 <stepik-777@mail.ru>
parents: 7386
diff changeset
   280
7198
5debd5fe526e 1. Add IFDEFs for video recording
Stepan777 <stepik-777@mail.ru>
parents: 7180
diff changeset
   281
procedure BeginPreRecording;
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   282
var format: word;
7306
3cff5c769509 Here they come - thumbnails.
Stepan777 <stepik-777@mail.ru>
parents: 7286
diff changeset
   283
    filename: shortstring;
7280
fd707afbc3a2 pagevideos is now much better that before:
Stepan777 <stepik-777@mail.ru>
parents: 7235
diff changeset
   284
    frequency, channels: LongInt;
14919
9ab78e08a34c Fix Pas2C unable to compile with VIDEOREC
Wuzzy <Wuzzy2@mail.ru>
parents: 14898
diff changeset
   285
    result: LongInt;
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   286
begin
14919
9ab78e08a34c Fix Pas2C unable to compile with VIDEOREC
Wuzzy <Wuzzy2@mail.ru>
parents: 14898
diff changeset
   287
    result:= 0;
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   288
    AddFileLog('BeginPreRecording');
7235
baa69bd025d9 1. Implement new page in frontend with options for video recording.
Stepan777 <stepik-777@mail.ru>
parents: 7198
diff changeset
   289
7369
46921fbe76d3 Move SDL_GetTicks() to another place, maybe this will fix sound desync.
Stepan777 <stepik-777@mail.ru>
parents: 7363
diff changeset
   290
    thumbnailSaved:= false;
14919
9ab78e08a34c Fix Pas2C unable to compile with VIDEOREC
Wuzzy <Wuzzy2@mail.ru>
parents: 14898
diff changeset
   291
    RecPrefix:= 'hw-' + FormatDateTime('YYYY-MM-DD_HH-mm-ss-z', TDateTime(Now()));
7306
3cff5c769509 Here they come - thumbnails.
Stepan777 <stepik-777@mail.ru>
parents: 7286
diff changeset
   292
7392
bc3306c59a08 Correctly distinguish between game and real ticks while recording video,
Stepan777 <stepik-777@mail.ru>
parents: 7386
diff changeset
   293
    // If this video is recorded from demo executed directly (without frontend)
bc3306c59a08 Correctly distinguish between game and real ticks while recording video,
Stepan777 <stepik-777@mail.ru>
parents: 7386
diff changeset
   294
    // then we need to copy demo so that frontend will be able to find it later.
bc3306c59a08 Correctly distinguish between game and real ticks while recording video,
Stepan777 <stepik-777@mail.ru>
parents: 7386
diff changeset
   295
    if recordFileName <> '' then
bc3306c59a08 Correctly distinguish between game and real ticks while recording video,
Stepan777 <stepik-777@mail.ru>
parents: 7386
diff changeset
   296
    begin
bc3306c59a08 Correctly distinguish between game and real ticks while recording video,
Stepan777 <stepik-777@mail.ru>
parents: 7386
diff changeset
   297
        if GameType <> gmtDemo then // this is save and game demo is not recording, abort
bc3306c59a08 Correctly distinguish between game and real ticks while recording video,
Stepan777 <stepik-777@mail.ru>
parents: 7386
diff changeset
   298
            exit;
14898
66b510a8b81c Pas2C: Fix path concatenation in uVideoRec
Wuzzy <Wuzzy2@mail.ru>
parents: 14892
diff changeset
   299
        CopyFile(recordFileName, shortstring(UserPathPrefix) + '/VideoTemp/' + shortstring(RecPrefix) + '.hwd');
7392
bc3306c59a08 Correctly distinguish between game and real ticks while recording video,
Stepan777 <stepik-777@mail.ru>
parents: 7386
diff changeset
   300
    end;
bc3306c59a08 Correctly distinguish between game and real ticks while recording video,
Stepan777 <stepik-777@mail.ru>
parents: 7386
diff changeset
   301
13497
c7df0d96da81 Fix video recorder not working if sound disabled (fixes bug 200)
Wuzzy <Wuzzy2@mail.ru>
parents: 13231
diff changeset
   302
    if cIsSoundEnabled then
c7df0d96da81 Fix video recorder not working if sound disabled (fixes bug 200)
Wuzzy <Wuzzy2@mail.ru>
parents: 13231
diff changeset
   303
        begin
c7df0d96da81 Fix video recorder not working if sound disabled (fixes bug 200)
Wuzzy <Wuzzy2@mail.ru>
parents: 13231
diff changeset
   304
        Mix_QuerySpec(@frequency, @format, @channels);
c7df0d96da81 Fix video recorder not working if sound disabled (fixes bug 200)
Wuzzy <Wuzzy2@mail.ru>
parents: 13231
diff changeset
   305
        AddFileLog('sound: frequency = ' + IntToStr(frequency) + ', format = ' + IntToStr(format) + ', channels = ' + IntToStr(channels));
c7df0d96da81 Fix video recorder not working if sound disabled (fixes bug 200)
Wuzzy <Wuzzy2@mail.ru>
parents: 13231
diff changeset
   306
        if format <> $8010 then
c7df0d96da81 Fix video recorder not working if sound disabled (fixes bug 200)
Wuzzy <Wuzzy2@mail.ru>
parents: 13231
diff changeset
   307
            begin
c7df0d96da81 Fix video recorder not working if sound disabled (fixes bug 200)
Wuzzy <Wuzzy2@mail.ru>
parents: 13231
diff changeset
   308
            // TODO: support any audio format
c7df0d96da81 Fix video recorder not working if sound disabled (fixes bug 200)
Wuzzy <Wuzzy2@mail.ru>
parents: 13231
diff changeset
   309
            AddFileLog('Error: Unexpected audio format ' + IntToStr(format));
c7df0d96da81 Fix video recorder not working if sound disabled (fixes bug 200)
Wuzzy <Wuzzy2@mail.ru>
parents: 13231
diff changeset
   310
            exit;
c7df0d96da81 Fix video recorder not working if sound disabled (fixes bug 200)
Wuzzy <Wuzzy2@mail.ru>
parents: 13231
diff changeset
   311
            end;
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   312
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   313
{$IOCHECKS OFF}
13497
c7df0d96da81 Fix video recorder not working if sound disabled (fixes bug 200)
Wuzzy <Wuzzy2@mail.ru>
parents: 13231
diff changeset
   314
        // create sound file
14898
66b510a8b81c Pas2C: Fix path concatenation in uVideoRec
Wuzzy <Wuzzy2@mail.ru>
parents: 14892
diff changeset
   315
        filename:= shortstring(UserPathPrefix) + '/VideoTemp/' + shortstring(RecPrefix) + '.sw';
13497
c7df0d96da81 Fix video recorder not working if sound disabled (fixes bug 200)
Wuzzy <Wuzzy2@mail.ru>
parents: 13231
diff changeset
   316
        Assign(audioFile, filename);
c7df0d96da81 Fix video recorder not working if sound disabled (fixes bug 200)
Wuzzy <Wuzzy2@mail.ru>
parents: 13231
diff changeset
   317
        Rewrite(audioFile, 1);
c7df0d96da81 Fix video recorder not working if sound disabled (fixes bug 200)
Wuzzy <Wuzzy2@mail.ru>
parents: 13231
diff changeset
   318
        if IOResult <> 0 then
c7df0d96da81 Fix video recorder not working if sound disabled (fixes bug 200)
Wuzzy <Wuzzy2@mail.ru>
parents: 13231
diff changeset
   319
            begin
c7df0d96da81 Fix video recorder not working if sound disabled (fixes bug 200)
Wuzzy <Wuzzy2@mail.ru>
parents: 13231
diff changeset
   320
            AddFileLog('Error: Could not write to ' + filename);
c7df0d96da81 Fix video recorder not working if sound disabled (fixes bug 200)
Wuzzy <Wuzzy2@mail.ru>
parents: 13231
diff changeset
   321
            exit;
c7df0d96da81 Fix video recorder not working if sound disabled (fixes bug 200)
Wuzzy <Wuzzy2@mail.ru>
parents: 13231
diff changeset
   322
            end;
c7df0d96da81 Fix video recorder not working if sound disabled (fixes bug 200)
Wuzzy <Wuzzy2@mail.ru>
parents: 13231
diff changeset
   323
        end;
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   324
7235
baa69bd025d9 1. Implement new page in frontend with options for video recording.
Stepan777 <stepik-777@mail.ru>
parents: 7198
diff changeset
   325
    // create file with camera positions
14898
66b510a8b81c Pas2C: Fix path concatenation in uVideoRec
Wuzzy <Wuzzy2@mail.ru>
parents: 14892
diff changeset
   326
    filename:= shortstring(UserPathPrefix) + '/VideoTemp/' + shortstring(RecPrefix) + '.txtout';
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   327
    Assign(cameraFile, filename);
14884
002f7d41f5ce VideoRec: Replace "File of" syntax to make Pas2C happy
Wuzzy <Wuzzy2@mail.ru>
parents: 14466
diff changeset
   328
    Rewrite(cameraFile, SizeOf(TFrame));
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   329
    if IOResult <> 0 then
13497
c7df0d96da81 Fix video recorder not working if sound disabled (fixes bug 200)
Wuzzy <Wuzzy2@mail.ru>
parents: 13231
diff changeset
   330
        begin
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   331
        AddFileLog('Error: Could not write to ' + filename);
7198
5debd5fe526e 1. Add IFDEFs for video recording
Stepan777 <stepik-777@mail.ru>
parents: 7180
diff changeset
   332
        exit;
13497
c7df0d96da81 Fix video recorder not working if sound disabled (fixes bug 200)
Wuzzy <Wuzzy2@mail.ru>
parents: 13231
diff changeset
   333
        end;
7280
fd707afbc3a2 pagevideos is now much better that before:
Stepan777 <stepik-777@mail.ru>
parents: 7235
diff changeset
   334
13497
c7df0d96da81 Fix video recorder not working if sound disabled (fixes bug 200)
Wuzzy <Wuzzy2@mail.ru>
parents: 13231
diff changeset
   335
    if cIsSoundEnabled then
c7df0d96da81 Fix video recorder not working if sound disabled (fixes bug 200)
Wuzzy <Wuzzy2@mail.ru>
parents: 13231
diff changeset
   336
        begin
c7df0d96da81 Fix video recorder not working if sound disabled (fixes bug 200)
Wuzzy <Wuzzy2@mail.ru>
parents: 13231
diff changeset
   337
        // save audio parameters in sound file
14919
9ab78e08a34c Fix Pas2C unable to compile with VIDEOREC
Wuzzy <Wuzzy2@mail.ru>
parents: 14898
diff changeset
   338
        BlockWrite(audioFile, frequency, 4, result);
9ab78e08a34c Fix Pas2C unable to compile with VIDEOREC
Wuzzy <Wuzzy2@mail.ru>
parents: 14898
diff changeset
   339
        BlockWrite(audioFile, channels, 4, result);
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   340
{$IOCHECKS ON}
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   341
13497
c7df0d96da81 Fix video recorder not working if sound disabled (fixes bug 200)
Wuzzy <Wuzzy2@mail.ru>
parents: 13231
diff changeset
   342
        // register callback for actual audio recording
c7df0d96da81 Fix video recorder not working if sound disabled (fixes bug 200)
Wuzzy <Wuzzy2@mail.ru>
parents: 13231
diff changeset
   343
        Mix_SetPostMix(@RecordPostMix, nil);
c7df0d96da81 Fix video recorder not working if sound disabled (fixes bug 200)
Wuzzy <Wuzzy2@mail.ru>
parents: 13231
diff changeset
   344
        end;
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   345
7369
46921fbe76d3 Move SDL_GetTicks() to another place, maybe this will fix sound desync.
Stepan777 <stepik-777@mail.ru>
parents: 7363
diff changeset
   346
    startTime:= SDL_GetTicks();
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   347
    flagPrerecording:= true;
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   348
end;
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   349
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   350
procedure StopPreRecording;
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   351
begin
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   352
    AddFileLog('StopPreRecording');
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   353
    flagPrerecording:= false;
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   354
13497
c7df0d96da81 Fix video recorder not working if sound disabled (fixes bug 200)
Wuzzy <Wuzzy2@mail.ru>
parents: 13231
diff changeset
   355
    if cIsSoundEnabled then
c7df0d96da81 Fix video recorder not working if sound disabled (fixes bug 200)
Wuzzy <Wuzzy2@mail.ru>
parents: 13231
diff changeset
   356
        begin
c7df0d96da81 Fix video recorder not working if sound disabled (fixes bug 200)
Wuzzy <Wuzzy2@mail.ru>
parents: 13231
diff changeset
   357
        // call SDL_LockAudio because RecordPostMix may be executing right now
c7df0d96da81 Fix video recorder not working if sound disabled (fixes bug 200)
Wuzzy <Wuzzy2@mail.ru>
parents: 13231
diff changeset
   358
        SDL_LockAudio();
c7df0d96da81 Fix video recorder not working if sound disabled (fixes bug 200)
Wuzzy <Wuzzy2@mail.ru>
parents: 13231
diff changeset
   359
        Close(audioFile);
13498
3bb07c847886 Whoops. Syntax error in uVideoRec
Wuzzy <Wuzzy2@mail.ru>
parents: 13497
diff changeset
   360
        end;
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   361
    Close(cameraFile);
13497
c7df0d96da81 Fix video recorder not working if sound disabled (fixes bug 200)
Wuzzy <Wuzzy2@mail.ru>
parents: 13231
diff changeset
   362
    if cIsSoundEnabled then
c7df0d96da81 Fix video recorder not working if sound disabled (fixes bug 200)
Wuzzy <Wuzzy2@mail.ru>
parents: 13231
diff changeset
   363
        begin
c7df0d96da81 Fix video recorder not working if sound disabled (fixes bug 200)
Wuzzy <Wuzzy2@mail.ru>
parents: 13231
diff changeset
   364
        Mix_SetPostMix(nil, nil);
c7df0d96da81 Fix video recorder not working if sound disabled (fixes bug 200)
Wuzzy <Wuzzy2@mail.ru>
parents: 13231
diff changeset
   365
        SDL_UnlockAudio();
c7df0d96da81 Fix video recorder not working if sound disabled (fixes bug 200)
Wuzzy <Wuzzy2@mail.ru>
parents: 13231
diff changeset
   366
        end;
7369
46921fbe76d3 Move SDL_GetTicks() to another place, maybe this will fix sound desync.
Stepan777 <stepik-777@mail.ru>
parents: 7363
diff changeset
   367
46921fbe76d3 Move SDL_GetTicks() to another place, maybe this will fix sound desync.
Stepan777 <stepik-777@mail.ru>
parents: 7363
diff changeset
   368
    if not thumbnailSaved then
46921fbe76d3 Move SDL_GetTicks() to another place, maybe this will fix sound desync.
Stepan777 <stepik-777@mail.ru>
parents: 7363
diff changeset
   369
        SaveThumbnail();
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   370
end;
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   371
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   372
procedure SaveCameraPosition;
7376
48b79b3ca592 rework saving of camera positions so there is no need to know framerate during prerecording.
Stepan777 <stepik-777@mail.ru>
parents: 7369
diff changeset
   373
var frame: TFrame;
14919
9ab78e08a34c Fix Pas2C unable to compile with VIDEOREC
Wuzzy <Wuzzy2@mail.ru>
parents: 14898
diff changeset
   374
    result: LongInt;
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   375
begin
14919
9ab78e08a34c Fix Pas2C unable to compile with VIDEOREC
Wuzzy <Wuzzy2@mail.ru>
parents: 14898
diff changeset
   376
    result:= 0;
7306
3cff5c769509 Here they come - thumbnails.
Stepan777 <stepik-777@mail.ru>
parents: 7286
diff changeset
   377
    if (not thumbnailSaved) and (ScreenFade = sfNone) then
3cff5c769509 Here they come - thumbnails.
Stepan777 <stepik-777@mail.ru>
parents: 7286
diff changeset
   378
        SaveThumbnail();
3cff5c769509 Here they come - thumbnails.
Stepan777 <stepik-777@mail.ru>
parents: 7286
diff changeset
   379
7376
48b79b3ca592 rework saving of camera positions so there is no need to know framerate during prerecording.
Stepan777 <stepik-777@mail.ru>
parents: 7369
diff changeset
   380
    frame.realTicks:= SDL_GetTicks() - startTime;
48b79b3ca592 rework saving of camera positions so there is no need to know framerate during prerecording.
Stepan777 <stepik-777@mail.ru>
parents: 7369
diff changeset
   381
    frame.gameTicks:= GameTicks;
48b79b3ca592 rework saving of camera positions so there is no need to know framerate during prerecording.
Stepan777 <stepik-777@mail.ru>
parents: 7369
diff changeset
   382
    frame.CamX:= WorldDx;
48b79b3ca592 rework saving of camera positions so there is no need to know framerate during prerecording.
Stepan777 <stepik-777@mail.ru>
parents: 7369
diff changeset
   383
    frame.CamY:= WorldDy - cScreenHeight div 2;
48b79b3ca592 rework saving of camera positions so there is no need to know framerate during prerecording.
Stepan777 <stepik-777@mail.ru>
parents: 7369
diff changeset
   384
    frame.zoom:= zoom/cScreenWidth;
14919
9ab78e08a34c Fix Pas2C unable to compile with VIDEOREC
Wuzzy <Wuzzy2@mail.ru>
parents: 14898
diff changeset
   385
    BlockWrite(cameraFile, frame, 1, result);
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   386
end;
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   387
7850
fcbb024090a4 cleanup in initEverything and freeEverything
koda
parents: 7816
diff changeset
   388
procedure initModule;
fcbb024090a4 cleanup in initEverything and freeEverything
koda
parents: 7816
diff changeset
   389
begin
9543
1826b5315369 Fix bug 656 by using the right resolution values
koda
parents: 9203
diff changeset
   390
    // we need to make sure these variables are initialized before the main loop
1826b5315369 Fix bug 656 by using the right resolution values
koda
parents: 9203
diff changeset
   391
    // or the wrapper will keep the default values of preinit
9545
f7a55d8e8f4d min->max
koda
parents: 9543
diff changeset
   392
    cScreenWidth:= max(cWindowedWidth, 640);
f7a55d8e8f4d min->max
koda
parents: 9543
diff changeset
   393
    cScreenHeight:= max(cWindowedHeight, 480);
7850
fcbb024090a4 cleanup in initEverything and freeEverything
koda
parents: 7816
diff changeset
   394
end;
fcbb024090a4 cleanup in initEverything and freeEverything
koda
parents: 7816
diff changeset
   395
7180
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   396
procedure freeModule;
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   397
begin
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   398
    if flagPrerecording then
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   399
        StopPreRecording();
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   400
end;
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   401
53ffc8853008 here it is
Stepan777 <stepik-777@mail.ru>
parents:
diff changeset
   402
end.
7286
068adc6948e3 remaining IFDEFs
Stepan777 <stepik-777@mail.ru>
parents: 7280
diff changeset
   403
068adc6948e3 remaining IFDEFs
Stepan777 <stepik-777@mail.ru>
parents: 7280
diff changeset
   404
{$ENDIF} // USE_VIDEO_RECORDING