QTfrontend/util/LibavInteraction.cpp
author S.D.
Tue, 27 Sep 2022 14:59:03 +0300
changeset 15878 fc3cb23fd26f
parent 15834 8fd36e1b66ed
permissions -rw-r--r--
Allow to see rooms of incompatible versions in the lobby For the new clients the room version is shown in a separate column. There is also a hack for previous versions clients: the room vesion specifier is prepended to the room names for rooms of incompatible versions, and the server shows 'incompatible version' error if the client tries to join them.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
7897
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
     1
/*
5e7c0810f365 libav name refactor
koda
parents:
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>
7897
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
     4
 *
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
     5
 * This program is free software; you can redistribute it and/or modify
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
     6
 * it under the terms of the GNU General Public License as published by
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
     7
 * the Free Software Foundation; version 2 of the License
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
     8
 *
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
     9
 * This program is distributed in the hope that it will be useful,
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
    12
 * GNU General Public License for more details.
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
    13
 *
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
    14
 * You should have received a copy of the GNU General Public License
5e7c0810f365 libav name refactor
koda
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
7897
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
    17
 */
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
    18
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
    19
#include "LibavInteraction.h"
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
    20
11852
d7227dc3b397 fix build
sheepluva
parents: 11356
diff changeset
    21
#ifdef VIDEOREC
7897
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
    22
extern "C"
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
    23
{
11298
9fcdf0969d53 Update libav API, keeping forward and backward compatibility
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11046
diff changeset
    24
#include "libavcodec/avcodec.h"
7897
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
    25
#include "libavformat/avformat.h"
11298
9fcdf0969d53 Update libav API, keeping forward and backward compatibility
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11046
diff changeset
    26
#include "libavutil/avutil.h"
7897
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
    27
}
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
    28
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
    29
#include <QVector>
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
    30
#include <QList>
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
    31
#include <QComboBox>
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
    32
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
    33
#include "HWApplication.h"
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
    34
11298
9fcdf0969d53 Update libav API, keeping forward and backward compatibility
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11046
diff changeset
    35
// compatibility section
11356
ac423fd2b9a3 libavinteraction: Adjust version guard for av_codec_is_encoder()
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11299
diff changeset
    36
#if LIBAVCODEC_VERSION_INT < AV_VERSION_INT(54, 8, 0)
ac423fd2b9a3 libavinteraction: Adjust version guard for av_codec_is_encoder()
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11299
diff changeset
    37
#define av_codec_is_encoder(x)          x->encode
ac423fd2b9a3 libavinteraction: Adjust version guard for av_codec_is_encoder()
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11299
diff changeset
    38
#endif
ac423fd2b9a3 libavinteraction: Adjust version guard for av_codec_is_encoder()
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11299
diff changeset
    39
11298
9fcdf0969d53 Update libav API, keeping forward and backward compatibility
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11046
diff changeset
    40
#if LIBAVCODEC_VERSION_MAJOR < 55
9fcdf0969d53 Update libav API, keeping forward and backward compatibility
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11046
diff changeset
    41
#define AVCodecID                       CodecID
9fcdf0969d53 Update libav API, keeping forward and backward compatibility
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11046
diff changeset
    42
#endif
9fcdf0969d53 Update libav API, keeping forward and backward compatibility
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11046
diff changeset
    43
9fcdf0969d53 Update libav API, keeping forward and backward compatibility
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11046
diff changeset
    44
#if LIBAVFORMAT_VERSION_MAJOR < 54
9fcdf0969d53 Update libav API, keeping forward and backward compatibility
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11046
diff changeset
    45
#define avformat_find_stream_info(x, y) av_find_stream_info(x)
9fcdf0969d53 Update libav API, keeping forward and backward compatibility
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11046
diff changeset
    46
#define avformat_close_input(x)         av_close_input_file(*(x))
9fcdf0969d53 Update libav API, keeping forward and backward compatibility
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11046
diff changeset
    47
#endif
9fcdf0969d53 Update libav API, keeping forward and backward compatibility
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11046
diff changeset
    48
9fcdf0969d53 Update libav API, keeping forward and backward compatibility
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11046
diff changeset
    49
#if LIBAVUTIL_VERSION_MAJOR < 54
9fcdf0969d53 Update libav API, keeping forward and backward compatibility
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11046
diff changeset
    50
#define AVPixelFormat                   PixelFormat
9fcdf0969d53 Update libav API, keeping forward and backward compatibility
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11046
diff changeset
    51
#define AV_PIX_FMT_YUV420P              PIX_FMT_YUV420P
9429
7a97a554ac80 libavinteraction: fix typo and and compiling with modern libav
koda
parents: 9107
diff changeset
    52
#endif
7a97a554ac80 libavinteraction: fix typo and and compiling with modern libav
koda
parents: 9107
diff changeset
    53
7897
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
    54
struct Codec
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
    55
{
11298
9fcdf0969d53 Update libav API, keeping forward and backward compatibility
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11046
diff changeset
    56
    AVCodecID id;
7897
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
    57
    bool isAudio;
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
    58
    QString shortName; // used for identification
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
    59
    QString longName; // used for displaying to user
14630
957db6db1a49 Clean up code a bit in LibavInteraction
Wuzzy <Wuzzy2@mail.ru>
parents: 13286
diff changeset
    60
    bool isRecommended;
7897
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
    61
};
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
    62
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
    63
struct Format
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
    64
{
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
    65
    QString shortName;
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
    66
    QString longName;
14630
957db6db1a49 Clean up code a bit in LibavInteraction
Wuzzy <Wuzzy2@mail.ru>
parents: 13286
diff changeset
    67
    bool isRecommended;
7897
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
    68
    QString extension;
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
    69
    QVector<Codec*> codecs;
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
    70
};
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
    71
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
    72
QList<Codec> codecs;
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
    73
QMap<QString,Format> formats;
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
    74
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
    75
// test if given format supports given codec
15834
8fd36e1b66ed avcodec 59+ compatibility
LocutusOfBorg
parents: 14631
diff changeset
    76
#if LIBAVCODEC_VERSION_MAJOR >= 59
8fd36e1b66ed avcodec 59+ compatibility
LocutusOfBorg
parents: 14631
diff changeset
    77
bool FormatQueryCodec(const AVOutputFormat *ofmt, enum AVCodecID codec_id)
8fd36e1b66ed avcodec 59+ compatibility
LocutusOfBorg
parents: 14631
diff changeset
    78
#else
11298
9fcdf0969d53 Update libav API, keeping forward and backward compatibility
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11046
diff changeset
    79
bool FormatQueryCodec(AVOutputFormat *ofmt, enum AVCodecID codec_id)
15834
8fd36e1b66ed avcodec 59+ compatibility
LocutusOfBorg
parents: 14631
diff changeset
    80
#endif
7897
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
    81
{
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
    82
#if LIBAVFORMAT_VERSION_MAJOR >= 54
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
    83
    return avformat_query_codec(ofmt, codec_id, FF_COMPLIANCE_NORMAL) == 1;
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
    84
#else
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
    85
    if (ofmt->codec_tag)
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
    86
        return !!av_codec_get_tag(ofmt->codec_tag, codec_id);
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
    87
    return codec_id == ofmt->video_codec || codec_id == ofmt->audio_codec;
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
    88
#endif
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
    89
}
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
    90
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
    91
LibavInteraction::LibavInteraction() : QObject()
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
    92
{
15834
8fd36e1b66ed avcodec 59+ compatibility
LocutusOfBorg
parents: 14631
diff changeset
    93
#if LIBAVCODEC_VERSION_MAJOR < 59
7897
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
    94
    // initialize libav and register all codecs and formats
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
    95
    av_register_all();
15834
8fd36e1b66ed avcodec 59+ compatibility
LocutusOfBorg
parents: 14631
diff changeset
    96
#endif
7897
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
    97
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
    98
    // get list of all codecs
15834
8fd36e1b66ed avcodec 59+ compatibility
LocutusOfBorg
parents: 14631
diff changeset
    99
#if LIBAVCODEC_VERSION_MAJOR >= 59
8fd36e1b66ed avcodec 59+ compatibility
LocutusOfBorg
parents: 14631
diff changeset
   100
    const AVCodec* pCodec = NULL;
8fd36e1b66ed avcodec 59+ compatibility
LocutusOfBorg
parents: 14631
diff changeset
   101
    void* i = 0;
8fd36e1b66ed avcodec 59+ compatibility
LocutusOfBorg
parents: 14631
diff changeset
   102
    while ((pCodec = av_codec_iterate(&i)))
8fd36e1b66ed avcodec 59+ compatibility
LocutusOfBorg
parents: 14631
diff changeset
   103
#else
7897
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   104
    AVCodec* pCodec = NULL;
8065
609d07b337b5 fix deprecation warnings for libav sources
koda
parents: 7897
diff changeset
   105
    while ((pCodec = av_codec_next(pCodec)))
15834
8fd36e1b66ed avcodec 59+ compatibility
LocutusOfBorg
parents: 14631
diff changeset
   106
#endif
7897
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   107
    {
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   108
        if (!av_codec_is_encoder(pCodec))
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   109
            continue;
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   110
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   111
        if (pCodec->type != AVMEDIA_TYPE_VIDEO && pCodec->type != AVMEDIA_TYPE_AUDIO)
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   112
            continue;
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   113
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   114
        // this encoders seems to be buggy
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   115
        if (strcmp(pCodec->name, "rv10") == 0 || strcmp(pCodec->name, "rv20") == 0)
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   116
            continue;
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   117
14631
92ebe33c5eb6 VideoRec: Hide libaom-av1 codec in frontend, it's experimental
Wuzzy <Wuzzy2@mail.ru>
parents: 14630
diff changeset
   118
        // this encoder is experimental (as of Jan 17, 2019)
92ebe33c5eb6 VideoRec: Hide libaom-av1 codec in frontend, it's experimental
Wuzzy <Wuzzy2@mail.ru>
parents: 14630
diff changeset
   119
        if (strcmp(pCodec->name, "libaom-av1") == 0)
92ebe33c5eb6 VideoRec: Hide libaom-av1 codec in frontend, it's experimental
Wuzzy <Wuzzy2@mail.ru>
parents: 14630
diff changeset
   120
            continue;
92ebe33c5eb6 VideoRec: Hide libaom-av1 codec in frontend, it's experimental
Wuzzy <Wuzzy2@mail.ru>
parents: 14630
diff changeset
   121
7897
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   122
        // doesn't support stereo sound
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   123
        if (strcmp(pCodec->name, "real_144") == 0)
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   124
            continue;
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   125
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   126
        if (!pCodec->long_name || strlen(pCodec->long_name) == 0)
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   127
            continue;
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   128
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   129
        if (pCodec->type == AVMEDIA_TYPE_VIDEO)
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   130
        {
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   131
            if (pCodec->supported_framerates != NULL)
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   132
                continue;
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   133
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   134
            // check if codec supports yuv 4:2:0 format
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   135
            if (!pCodec->pix_fmts)
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   136
                continue;
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   137
            bool yuv420Supported = false;
11299
64ad779be7bf Specify the enum type for Pixel and Sample formats
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11298
diff changeset
   138
            for (const enum AVPixelFormat* pfmt = pCodec->pix_fmts; *pfmt != -1; pfmt++)
11298
9fcdf0969d53 Update libav API, keeping forward and backward compatibility
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11046
diff changeset
   139
                if (*pfmt == AV_PIX_FMT_YUV420P)
7897
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   140
                {
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   141
                    yuv420Supported = true;
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   142
                    break;
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   143
                }
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   144
            if (!yuv420Supported)
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   145
                continue;
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   146
        }
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   147
        if (pCodec->type == AVMEDIA_TYPE_AUDIO)
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   148
        {
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   149
            // check if codec supports signed 16-bit format
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   150
            if (!pCodec->sample_fmts)
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   151
                continue;
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   152
            bool s16Supported = false;
11299
64ad779be7bf Specify the enum type for Pixel and Sample formats
Vittorio Giovara <vittorio.giovara@gmail.com>
parents: 11298
diff changeset
   153
            for (const enum AVSampleFormat* pfmt = pCodec->sample_fmts; *pfmt != -1; pfmt++)
7897
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   154
                if (*pfmt == AV_SAMPLE_FMT_S16)
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   155
                {
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   156
                    s16Supported = true;
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   157
                    break;
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   158
                }
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   159
            if (!s16Supported)
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   160
                continue;
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   161
        }
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   162
        // add codec to list of codecs
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   163
        codecs.push_back(Codec());
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   164
        Codec & codec = codecs.back();
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   165
        codec.id = pCodec->id;
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   166
        codec.isAudio = pCodec->type == AVMEDIA_TYPE_AUDIO;
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   167
        codec.shortName = pCodec->name;
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   168
        codec.longName = pCodec->long_name;
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   169
14630
957db6db1a49 Clean up code a bit in LibavInteraction
Wuzzy <Wuzzy2@mail.ru>
parents: 13286
diff changeset
   170
        codec.isRecommended = false;
7897
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   171
        if (strcmp(pCodec->name, "libx264") == 0)
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   172
        {
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   173
            codec.longName = "H.264/MPEG-4 Part 10 AVC (x264)";
14630
957db6db1a49 Clean up code a bit in LibavInteraction
Wuzzy <Wuzzy2@mail.ru>
parents: 13286
diff changeset
   174
            codec.isRecommended = true;
7897
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   175
        }
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   176
        else if (strcmp(pCodec->name, "libxvid") == 0)
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   177
        {
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   178
            codec.longName = "MPEG-4 Part 2 (Xvid)";
14630
957db6db1a49 Clean up code a bit in LibavInteraction
Wuzzy <Wuzzy2@mail.ru>
parents: 13286
diff changeset
   179
            codec.isRecommended = true;
7897
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   180
        }
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   181
        else if (strcmp(pCodec->name, "libmp3lame") == 0)
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   182
        {
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   183
            codec.longName = "MP3 (MPEG audio layer 3) (LAME)";
14630
957db6db1a49 Clean up code a bit in LibavInteraction
Wuzzy <Wuzzy2@mail.ru>
parents: 13286
diff changeset
   184
            codec.isRecommended = true;
7897
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   185
        }
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   186
        else
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   187
            codec.longName = pCodec->long_name;
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   188
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   189
        if (strcmp(pCodec->name, "mpeg4") == 0 || strcmp(pCodec->name, "ac3_fixed") == 0)
14630
957db6db1a49 Clean up code a bit in LibavInteraction
Wuzzy <Wuzzy2@mail.ru>
parents: 13286
diff changeset
   190
            codec.isRecommended = true;
7897
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   191
    }
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   192
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   193
    // get list of all formats
15834
8fd36e1b66ed avcodec 59+ compatibility
LocutusOfBorg
parents: 14631
diff changeset
   194
#if LIBAVCODEC_VERSION_MAJOR >= 59
8fd36e1b66ed avcodec 59+ compatibility
LocutusOfBorg
parents: 14631
diff changeset
   195
    const AVOutputFormat* pFormat = NULL;
8fd36e1b66ed avcodec 59+ compatibility
LocutusOfBorg
parents: 14631
diff changeset
   196
    i = 0;
8fd36e1b66ed avcodec 59+ compatibility
LocutusOfBorg
parents: 14631
diff changeset
   197
    while ((pFormat = av_muxer_iterate(&i)))
8fd36e1b66ed avcodec 59+ compatibility
LocutusOfBorg
parents: 14631
diff changeset
   198
#else
7897
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   199
    AVOutputFormat* pFormat = NULL;
8065
609d07b337b5 fix deprecation warnings for libav sources
koda
parents: 7897
diff changeset
   200
    while ((pFormat = av_oformat_next(pFormat)))
15834
8fd36e1b66ed avcodec 59+ compatibility
LocutusOfBorg
parents: 14631
diff changeset
   201
#endif
7897
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   202
    {
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   203
        if (!pFormat->extensions)
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   204
            continue;
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   205
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   206
        // skip some strange formats to not confuse users
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   207
        if (strstr(pFormat->long_name, "raw"))
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   208
            continue;
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   209
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   210
        Format format;
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   211
        bool hasVideoCodec = false;
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   212
        for (QList<Codec>::iterator codec = codecs.begin(); codec != codecs.end(); ++codec)
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   213
        {
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   214
            if (!FormatQueryCodec(pFormat, codec->id))
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   215
                continue;
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   216
            format.codecs.push_back(&*codec);
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   217
            if (!codec->isAudio)
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   218
                hasVideoCodec = true;
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   219
        }
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   220
        if (!hasVideoCodec)
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   221
            continue;
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   222
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   223
        QString ext(pFormat->extensions);
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   224
        ext.truncate(strcspn(pFormat->extensions, ","));
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   225
        format.extension = ext;
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   226
        format.shortName = pFormat->name;
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   227
        format.longName = QString("%1 (*.%2)").arg(pFormat->long_name).arg(ext);
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   228
14630
957db6db1a49 Clean up code a bit in LibavInteraction
Wuzzy <Wuzzy2@mail.ru>
parents: 13286
diff changeset
   229
        format.isRecommended = strcmp(pFormat->name, "mp4") == 0 || strcmp(pFormat->name, "avi") == 0;
7897
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   230
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   231
        formats[pFormat->name] = format;
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   232
    }
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   233
}
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   234
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   235
void LibavInteraction::fillFormats(QComboBox * pFormats)
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   236
{
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   237
    // first insert recomended formats
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   238
    foreach(const Format & format, formats)
14630
957db6db1a49 Clean up code a bit in LibavInteraction
Wuzzy <Wuzzy2@mail.ru>
parents: 13286
diff changeset
   239
        if (format.isRecommended)
7897
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   240
            pFormats->addItem(format.longName, format.shortName);
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   241
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   242
    // remember where to place separator between recomended and other formats
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   243
    int sep = pFormats->count();
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   244
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   245
    // insert remaining formats
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   246
    foreach(const Format & format, formats)
14630
957db6db1a49 Clean up code a bit in LibavInteraction
Wuzzy <Wuzzy2@mail.ru>
parents: 13286
diff changeset
   247
        if (!format.isRecommended)
7897
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   248
            pFormats->addItem(format.longName, format.shortName);
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   249
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   250
    // insert separator if necessary
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   251
    if (sep != 0 && sep != pFormats->count())
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   252
        pFormats->insertSeparator(sep);
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   253
}
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   254
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   255
void LibavInteraction::fillCodecs(const QString & fmt, QComboBox * pVCodecs, QComboBox * pACodecs)
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   256
{
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   257
    Format & format = formats[fmt];
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   258
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   259
    // first insert recomended codecs
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   260
    foreach(Codec * codec, format.codecs)
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   261
    {
14630
957db6db1a49 Clean up code a bit in LibavInteraction
Wuzzy <Wuzzy2@mail.ru>
parents: 13286
diff changeset
   262
        if (codec->isRecommended)
7897
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   263
        {
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   264
            if (codec->isAudio)
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   265
                pACodecs->addItem(codec->longName, codec->shortName);
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   266
            else
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   267
                pVCodecs->addItem(codec->longName, codec->shortName);
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   268
        }
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   269
    }
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   270
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   271
    // remember where to place separators between recomended and other codecs
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   272
    int vsep = pVCodecs->count();
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   273
    int asep = pACodecs->count();
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   274
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   275
    // insert remaining codecs
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   276
    foreach(Codec * codec, format.codecs)
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   277
    {
14630
957db6db1a49 Clean up code a bit in LibavInteraction
Wuzzy <Wuzzy2@mail.ru>
parents: 13286
diff changeset
   278
        if (!codec->isRecommended)
7897
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   279
        {
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   280
            if (codec->isAudio)
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   281
                pACodecs->addItem(codec->longName, codec->shortName);
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   282
            else
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   283
                pVCodecs->addItem(codec->longName, codec->shortName);
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   284
        }
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   285
    }
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   286
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   287
    // insert separators if necessary
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   288
    if (vsep != 0 && vsep != pVCodecs->count())
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   289
        pVCodecs->insertSeparator(vsep);
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   290
    if (asep != 0 && asep != pACodecs->count())
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   291
        pACodecs->insertSeparator(asep);
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   292
}
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   293
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   294
QString LibavInteraction::getExtension(const QString & format)
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   295
{
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   296
    return formats[format].extension;
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   297
}
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   298
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   299
// get information abaout file (duration, resolution etc) in multiline string
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   300
QString LibavInteraction::getFileInfo(const QString & filepath)
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   301
{
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   302
    AVFormatContext* pContext = NULL;
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   303
    QByteArray utf8path = filepath.toUtf8();
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   304
    if (avformat_open_input(&pContext, utf8path.data(), NULL, NULL) < 0)
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   305
        return "";
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   306
    if (avformat_find_stream_info(pContext, NULL) < 0)
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   307
        return "";
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   308
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   309
    int s = float(pContext->duration)/AV_TIME_BASE;
12239
8db93a3a29dc Use standard units and abbreviations in frontend
Wuzzy <almikes@aol.com>
parents: 11852
diff changeset
   310
    //: Duration in minutes and seconds (SI units)
8db93a3a29dc Use standard units and abbreviations in frontend
Wuzzy <almikes@aol.com>
parents: 11852
diff changeset
   311
    QString desc = tr("Duration: %1min %2s").arg(s/60).arg(s%60) + "\n";
7897
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   312
    for (int i = 0; i < (int)pContext->nb_streams; i++)
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   313
    {
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   314
        AVStream* pStream = pContext->streams[i];
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   315
        if (!pStream)
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   316
            continue;
15834
8fd36e1b66ed avcodec 59+ compatibility
LocutusOfBorg
parents: 14631
diff changeset
   317
#if LIBAVCODEC_VERSION_MAJOR >= 59
8fd36e1b66ed avcodec 59+ compatibility
LocutusOfBorg
parents: 14631
diff changeset
   318
        const AVCodec *st_codec = avcodec_find_decoder(pContext->streams[i]->codecpar->codec_id);
8fd36e1b66ed avcodec 59+ compatibility
LocutusOfBorg
parents: 14631
diff changeset
   319
        AVCodecContext* pCodec = avcodec_alloc_context3(st_codec);
8fd36e1b66ed avcodec 59+ compatibility
LocutusOfBorg
parents: 14631
diff changeset
   320
        avcodec_parameters_to_context(pCodec, pContext->streams[i]->codecpar);
8fd36e1b66ed avcodec 59+ compatibility
LocutusOfBorg
parents: 14631
diff changeset
   321
#else
7897
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   322
        AVCodecContext* pCodec = pContext->streams[i]->codec;
15834
8fd36e1b66ed avcodec 59+ compatibility
LocutusOfBorg
parents: 14631
diff changeset
   323
#endif
7897
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   324
        if (!pCodec)
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   325
            continue;
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   326
13286
1fbf2ac1f13e Videos frontend page: Locale-aware text formatting
Wuzzy <Wuzzy2@mail.ru>
parents: 13226
diff changeset
   327
15834
8fd36e1b66ed avcodec 59+ compatibility
LocutusOfBorg
parents: 14631
diff changeset
   328
#if LIBAVCODEC_VERSION_MAJOR >= 59
8fd36e1b66ed avcodec 59+ compatibility
LocutusOfBorg
parents: 14631
diff changeset
   329
        const AVCodec* pDecoder = avcodec_find_decoder(pCodec->codec_id);
8fd36e1b66ed avcodec 59+ compatibility
LocutusOfBorg
parents: 14631
diff changeset
   330
#else
13286
1fbf2ac1f13e Videos frontend page: Locale-aware text formatting
Wuzzy <Wuzzy2@mail.ru>
parents: 13226
diff changeset
   331
        AVCodec* pDecoder = avcodec_find_decoder(pCodec->codec_id);
15834
8fd36e1b66ed avcodec 59+ compatibility
LocutusOfBorg
parents: 14631
diff changeset
   332
#endif
13286
1fbf2ac1f13e Videos frontend page: Locale-aware text formatting
Wuzzy <Wuzzy2@mail.ru>
parents: 13226
diff changeset
   333
        QString decoderName = pDecoder ? pDecoder->name : tr("unknown");
7897
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   334
        if (pCodec->codec_type == AVMEDIA_TYPE_VIDEO)
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   335
        {
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   336
            if (pStream->avg_frame_rate.den)
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   337
            {
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   338
                float fps = float(pStream->avg_frame_rate.num)/pStream->avg_frame_rate.den;
13286
1fbf2ac1f13e Videos frontend page: Locale-aware text formatting
Wuzzy <Wuzzy2@mail.ru>
parents: 13226
diff changeset
   339
                //: Video metadata. %1 = video width, %2 = video height, %3 = frames per second = %4 = decoder name
1fbf2ac1f13e Videos frontend page: Locale-aware text formatting
Wuzzy <Wuzzy2@mail.ru>
parents: 13226
diff changeset
   340
                desc += QString(tr("Video: %1x%2, %3 FPS, %4")).arg(pCodec->width).arg(pCodec->height).arg(QLocale().toString(fps, 'f', 2)).arg(decoderName);
1fbf2ac1f13e Videos frontend page: Locale-aware text formatting
Wuzzy <Wuzzy2@mail.ru>
parents: 13226
diff changeset
   341
            }
1fbf2ac1f13e Videos frontend page: Locale-aware text formatting
Wuzzy <Wuzzy2@mail.ru>
parents: 13226
diff changeset
   342
            else
1fbf2ac1f13e Videos frontend page: Locale-aware text formatting
Wuzzy <Wuzzy2@mail.ru>
parents: 13226
diff changeset
   343
            {
1fbf2ac1f13e Videos frontend page: Locale-aware text formatting
Wuzzy <Wuzzy2@mail.ru>
parents: 13226
diff changeset
   344
                //: Video metadata. %1 = video width, %2 = video height, %3 = decoder name
1fbf2ac1f13e Videos frontend page: Locale-aware text formatting
Wuzzy <Wuzzy2@mail.ru>
parents: 13226
diff changeset
   345
                desc += QString(tr("Video: %1x%2, %3")).arg(pCodec->width).arg(pCodec->height).arg(decoderName);
7897
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   346
            }
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   347
        }
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   348
        else if (pCodec->codec_type == AVMEDIA_TYPE_AUDIO)
13286
1fbf2ac1f13e Videos frontend page: Locale-aware text formatting
Wuzzy <Wuzzy2@mail.ru>
parents: 13226
diff changeset
   349
        {
7897
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   350
            desc += tr("Audio: ");
13286
1fbf2ac1f13e Videos frontend page: Locale-aware text formatting
Wuzzy <Wuzzy2@mail.ru>
parents: 13226
diff changeset
   351
            desc += decoderName;
1fbf2ac1f13e Videos frontend page: Locale-aware text formatting
Wuzzy <Wuzzy2@mail.ru>
parents: 13226
diff changeset
   352
        }
7897
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   353
        else
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   354
            continue;
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   355
        desc += "\n";
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   356
    }
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   357
    AVDictionaryEntry* pComment = av_dict_get(pContext->metadata, "comment", NULL, 0);
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   358
    if (pComment)
13226
4028d7f85233 Make video metadata strings translatable in frontend
Wuzzy <Wuzzy2@mail.ru>
parents: 12239
diff changeset
   359
    {
4028d7f85233 Make video metadata strings translatable in frontend
Wuzzy <Wuzzy2@mail.ru>
parents: 12239
diff changeset
   360
        // Video comment. We expect a simple key value storage in a particular format
4028d7f85233 Make video metadata strings translatable in frontend
Wuzzy <Wuzzy2@mail.ru>
parents: 12239
diff changeset
   361
        // and parse it here so the key names can be localized.
4028d7f85233 Make video metadata strings translatable in frontend
Wuzzy <Wuzzy2@mail.ru>
parents: 12239
diff changeset
   362
        desc += QString("\n");
4028d7f85233 Make video metadata strings translatable in frontend
Wuzzy <Wuzzy2@mail.ru>
parents: 12239
diff changeset
   363
        QStringList strings = QString(pComment->value).split('\n');
4028d7f85233 Make video metadata strings translatable in frontend
Wuzzy <Wuzzy2@mail.ru>
parents: 12239
diff changeset
   364
        QString sPlayer, sTheme, sMap, sRecord;
4028d7f85233 Make video metadata strings translatable in frontend
Wuzzy <Wuzzy2@mail.ru>
parents: 12239
diff changeset
   365
        for(int i=0; i < strings.count(); i++)
4028d7f85233 Make video metadata strings translatable in frontend
Wuzzy <Wuzzy2@mail.ru>
parents: 12239
diff changeset
   366
        {
4028d7f85233 Make video metadata strings translatable in frontend
Wuzzy <Wuzzy2@mail.ru>
parents: 12239
diff changeset
   367
            QString s = strings.at(i);
4028d7f85233 Make video metadata strings translatable in frontend
Wuzzy <Wuzzy2@mail.ru>
parents: 12239
diff changeset
   368
            // Original key names are in English, like:
4028d7f85233 Make video metadata strings translatable in frontend
Wuzzy <Wuzzy2@mail.ru>
parents: 12239
diff changeset
   369
            //     Key: Value
4028d7f85233 Make video metadata strings translatable in frontend
Wuzzy <Wuzzy2@mail.ru>
parents: 12239
diff changeset
   370
            if (s.startsWith("Player: "))
4028d7f85233 Make video metadata strings translatable in frontend
Wuzzy <Wuzzy2@mail.ru>
parents: 12239
diff changeset
   371
                sPlayer = QString(s.mid(8));
4028d7f85233 Make video metadata strings translatable in frontend
Wuzzy <Wuzzy2@mail.ru>
parents: 12239
diff changeset
   372
            else if (s.startsWith("Theme: "))
4028d7f85233 Make video metadata strings translatable in frontend
Wuzzy <Wuzzy2@mail.ru>
parents: 12239
diff changeset
   373
                sTheme = QString(s.mid(7));
4028d7f85233 Make video metadata strings translatable in frontend
Wuzzy <Wuzzy2@mail.ru>
parents: 12239
diff changeset
   374
            else if (s.startsWith("Map: "))
4028d7f85233 Make video metadata strings translatable in frontend
Wuzzy <Wuzzy2@mail.ru>
parents: 12239
diff changeset
   375
                sMap = QString(s.mid(5));
4028d7f85233 Make video metadata strings translatable in frontend
Wuzzy <Wuzzy2@mail.ru>
parents: 12239
diff changeset
   376
            else if (s.startsWith("Record: "))
4028d7f85233 Make video metadata strings translatable in frontend
Wuzzy <Wuzzy2@mail.ru>
parents: 12239
diff changeset
   377
                sRecord = QString(s.mid(8));
4028d7f85233 Make video metadata strings translatable in frontend
Wuzzy <Wuzzy2@mail.ru>
parents: 12239
diff changeset
   378
        }
4028d7f85233 Make video metadata strings translatable in frontend
Wuzzy <Wuzzy2@mail.ru>
parents: 12239
diff changeset
   379
        if(!sPlayer.isNull())
4028d7f85233 Make video metadata strings translatable in frontend
Wuzzy <Wuzzy2@mail.ru>
parents: 12239
diff changeset
   380
            desc += QString(tr("Player: %1")).arg(sPlayer) + "\n";
4028d7f85233 Make video metadata strings translatable in frontend
Wuzzy <Wuzzy2@mail.ru>
parents: 12239
diff changeset
   381
        if(!sTheme.isNull())
4028d7f85233 Make video metadata strings translatable in frontend
Wuzzy <Wuzzy2@mail.ru>
parents: 12239
diff changeset
   382
            desc += QString(tr("Theme: %1")).arg(sTheme) + "\n";
4028d7f85233 Make video metadata strings translatable in frontend
Wuzzy <Wuzzy2@mail.ru>
parents: 12239
diff changeset
   383
        if(!sMap.isNull())
4028d7f85233 Make video metadata strings translatable in frontend
Wuzzy <Wuzzy2@mail.ru>
parents: 12239
diff changeset
   384
            desc += QString(tr("Map: %1")).arg(sMap) + "\n";
4028d7f85233 Make video metadata strings translatable in frontend
Wuzzy <Wuzzy2@mail.ru>
parents: 12239
diff changeset
   385
        if(!sRecord.isNull())
4028d7f85233 Make video metadata strings translatable in frontend
Wuzzy <Wuzzy2@mail.ru>
parents: 12239
diff changeset
   386
            //: As in ‘recording’
4028d7f85233 Make video metadata strings translatable in frontend
Wuzzy <Wuzzy2@mail.ru>
parents: 12239
diff changeset
   387
            desc += QString(tr("Record: %1")).arg(sRecord);
4028d7f85233 Make video metadata strings translatable in frontend
Wuzzy <Wuzzy2@mail.ru>
parents: 12239
diff changeset
   388
    }
7897
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   389
    avformat_close_input(&pContext);
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   390
    return desc;
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   391
}
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   392
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   393
#else
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   394
LibavInteraction::LibavInteraction() : QObject()
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   395
{
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   396
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   397
}
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   398
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   399
void LibavInteraction::fillFormats(QComboBox * pFormats)
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   400
{
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   401
    Q_UNUSED(pFormats);
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   402
}
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   403
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   404
void LibavInteraction::fillCodecs(const QString & format, QComboBox * pVCodecs, QComboBox * pACodecs)
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   405
{
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   406
    Q_UNUSED(format);
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   407
    Q_UNUSED(pVCodecs);
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   408
    Q_UNUSED(pACodecs);
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   409
}
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   410
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   411
QString LibavInteraction::getExtension(const QString & format)
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   412
{
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   413
    Q_UNUSED(format);
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   414
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   415
    return QString();
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   416
}
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   417
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   418
QString LibavInteraction::getFileInfo(const QString & filepath)
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   419
{
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   420
    Q_UNUSED(filepath);
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   421
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   422
    return QString();
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   423
}
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   424
#endif
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   425
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   426
LibavInteraction & LibavInteraction::instance()
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   427
{
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   428
    static LibavInteraction instance;
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   429
    return instance;
5e7c0810f365 libav name refactor
koda
parents:
diff changeset
   430
}