QTfrontend/util/LibavInteraction.cpp
author unC0Rr
Fri, 19 Apr 2024 17:45:05 +0200
changeset 16011 52b51d92e88d
parent 15834 8fd36e1b66ed
permissions -rw-r--r--
Fix build
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
}