Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Не могу разобраться в исходнике
Форум на CrossPlatform.RU > Библиотеки > wxWidgets
RazrFalcon
Раскрывающийся текст
#include <wx/filename.h>
extern "C" {
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
}
#include "include/aegisub/aegisub.h"


class LAVCFile {
private:
    unsigned refs;

    LAVCFile(Aegisub::String filename);
    ~LAVCFile();

    class Initializer {
    public:
        Initializer();
    };
    static Initializer init;

public:
    AVFormatContext *fctx;
    
    static LAVCFile *Create(Aegisub::String filename) { return new LAVCFile(filename); }
    LAVCFile *AddRef() { refs++; return this; };
    void Release() { if (!--refs) delete this; };
};
Раскрывающийся текст
#include <wx/wxprec.h>
#include "lavc_file.h"
#include <vector>

struct LAVCFrameInfo {
    int64_t DTS;
    bool isKeyFrame;
    LAVCFrameInfo(int64_t ADTS, bool isAKeyFrame) : DTS(ADTS), isKeyFrame(isAKeyFrame) {};
};

typedef std::vector<LAVCFrameInfo> LAVCFrameInfoVector;

class LAVCKeyFrames {
    private:
        LAVCFile* file;                    // Video file
        AVStream* stream;                // Used stream
        int streamN;                    // Stream index
        int numFrames;                    // number of frames in the video
    protected:
        LAVCFrameInfoVector framesData;
    public:
        LAVCKeyFrames(const Aegisub::String filename);
        ~LAVCKeyFrames();
        wxArrayInt GetKeyFrames();
        int GetNumFrames();
        LAVCFrameInfoVector GetFrameData();
};
Раскрывающийся текст
LAVCKeyFrames::LAVCKeyFrames(const Aegisub::String filename) 
: file(0), stream(0), streamN(-1), numFrames(0) {
    // Open LAVCFile
    file = LAVCFile::Create(filename);

    // Find video stream
    for (unsigned int i = 0; i < file->fctx->nb_streams; ++i) {
        if (file->fctx->streams[i]->codec->codec_type == CODEC_TYPE_VIDEO) {
            stream = file->fctx->streams[i];
            streamN = i;
            break;
        }
    }
    if (streamN == -1) throw _T("ffmpeg keyframes reader: Could not find a video stream");

}


Это нужные куски из исходников aegisub.
Мне нужно получить номера ключевых кадров.
Суть в том что я не понимаю как они к файлу прикрутили, то есть
file->fctx->streams[i]->codec->codec_type
Сначала это была строчка с именем файла, а затем уже у него появились и AVFormatContext *fctx.
Не пойму как это можно переписать на QT, с wxWidgets не сталкивался.
Iron Bug
wxWidgets тут ни при чём вообще. смотри, как реализован класс AVFormatContext - и всё.
RazrFalcon
Класс AVFormatContext может возвращать имя файла. А мне бы ему его как то задать.


Ниже его реализация (не моя конечно), я вообще практически ни чего не понимаю... Точнее не понимаю как задать файл.
Раскрывающийся текст
/**
* Format I/O context.
* New fields can be added to the end with minor version bumps.
* Removal, reordering and changes to existing fields require a major
* version bump.
* sizeof(AVFormatContext) must not be used outside libav*.
*/
typedef struct AVFormatContext {
    const AVClass *av_class; /**< Set by avformat_alloc_context. */
    /* Can only be iformat or oformat, not both at the same time. */
    struct AVInputFormat *iformat;
    struct AVOutputFormat *oformat;
    void *priv_data;
    ByteIOContext *pb;
    unsigned int nb_streams;
    AVStream *streams[MAX_STREAMS];
    char filename[1024]; /**< input or output filename */
    /* stream info */
    int64_t timestamp;
#if LIBAVFORMAT_VERSION_INT < (53<<16)
    char title[512];
    char author[512];
    char copyright[512];
    char comment[512];
    char album[512];
    int year;  /**< ID3 year, 0 if none */
    int track; /**< track number, 0 if none */
    char genre[32]; /**< ID3 genre */
#endif

    int ctx_flags; /**< Format-specific flags, see AVFMTCTX_xx */
    /* private data for pts handling (do not modify directly). */
    /** This buffer is only needed when packets were already buffered but
       not decoded, for example to get the codec parameters in MPEG
       streams. */
    struct AVPacketList *packet_buffer;

    /** Decoding: position of the first frame of the component, in
       AV_TIME_BASE fractional seconds. NEVER set this value directly:
       It is deduced from the AVStream values.  */
    int64_t start_time;
    /** Decoding: duration of the stream, in AV_TIME_BASE fractional
       seconds. Only set this value if you know none of the individual stream
       durations and also dont set any of them. This is deduced from the
       AVStream values if not set.  */
    int64_t duration;
    /** decoding: total file size, 0 if unknown */
    int64_t file_size;
    /** Decoding: total stream bitrate in bit/s, 0 if not
       available. Never set it directly if the file_size and the
       duration are known as FFmpeg can compute it automatically. */
    int bit_rate;

    /* av_read_frame() support */
    AVStream *cur_st;
#if LIBAVFORMAT_VERSION_INT < (53<<16)
    const uint8_t *cur_ptr_deprecated;
    int cur_len_deprecated;
    AVPacket cur_pkt_deprecated;
#endif

    /* av_seek_frame() support */
    int64_t data_offset; /** offset of the first packet */
    int index_built;

    int mux_rate;
    unsigned int packet_size;
    int preload;
    int max_delay;

#define AVFMT_NOOUTPUTLOOP -1
#define AVFMT_INFINITEOUTPUTLOOP 0
    /** number of times to loop output in formats that support it */
    int loop_output;

    int flags;
#define AVFMT_FLAG_GENPTS       0x0001 ///< Generate missing pts even if it requires parsing future frames.
#define AVFMT_FLAG_IGNIDX       0x0002 ///< Ignore index.
#define AVFMT_FLAG_NONBLOCK     0x0004 ///< Do not block when reading packets from input.
#define AVFMT_FLAG_IGNDTS       0x0008 ///< Ignore DTS on frames that contain both DTS & PTS
#define AVFMT_FLAG_NOFILLIN     0x0010 ///< Do not infer any values from other values, just return what is stored in the container
#define AVFMT_FLAG_NOPARSE      0x0020 ///< Do not use AVParsers, you also must set AVFMT_FLAG_NOFILLIN as the fillin code works on frames and no parsing -> no frames. Also seeking to frames can not work if parsing to find frame boundaries has been disabled
#define AVFMT_FLAG_RTP_HINT     0x0040 ///< Add RTP hinting to the output file

    int loop_input;
    /** decoding: size of data to probe; encoding: unused. */
    unsigned int probesize;

    /**
     * Maximum time (in AV_TIME_BASE units) during which the input should
     * be analyzed in av_find_stream_info().
     */
    int max_analyze_duration;

    const uint8_t *key;
    int keylen;

    unsigned int nb_programs;
    AVProgram **programs;

    /**
     * Forced video codec_id.
     * Demuxing: Set by user.
     */
    enum CodecID video_codec_id;
    /**
     * Forced audio codec_id.
     * Demuxing: Set by user.
     */
    enum CodecID audio_codec_id;
    /**
     * Forced subtitle codec_id.
     * Demuxing: Set by user.
     */
    enum CodecID subtitle_codec_id;

    /**
     * Maximum amount of memory in bytes to use for the index of each stream.
     * If the index exceeds this size, entries will be discarded as
     * needed to maintain a smaller size. This can lead to slower or less
     * accurate seeking (depends on demuxer).
     * Demuxers for which a full in-memory index is mandatory will ignore
     * this.
     * muxing  : unused
     * demuxing: set by user
     */
    unsigned int max_index_size;

    /**
     * Maximum amount of memory in bytes to use for buffering frames
     * obtained from realtime capture devices.
     */
    unsigned int max_picture_buffer;

    unsigned int nb_chapters;
    AVChapter **chapters;

    /**
     * Flags to enable debugging.
     */
    int debug;
#define FF_FDEBUG_TS        0x0001

    /**
     * Raw packets from the demuxer, prior to parsing and decoding.
     * This buffer is used for buffering packets until the codec can
     * be identified, as parsing cannot be done without knowing the
     * codec.
     */
    struct AVPacketList *raw_packet_buffer;
    struct AVPacketList *raw_packet_buffer_end;

    struct AVPacketList *packet_buffer_end;

    AVMetadata *metadata;

    /**
     * Remaining size available for raw_packet_buffer, in bytes.
     * NOT PART OF PUBLIC API
     */
#define RAW_PACKET_BUFFER_SIZE 2500000
    int raw_packet_buffer_remaining_size;

    /**
     * Start time of the stream in real world time, in microseconds
     * since the unix epoch (00:00 1st January 1970). That is, pts=0
     * in the stream was captured at this real world time.
     * - encoding: Set by user.
     * - decoding: Unused.
     */
    int64_t start_time_realtime;
} AVFormatContext;
Iron Bug
это объявление класса, а не реализация. причём код совершенно нормальный, прозрачный, даже снабжён комментариями.

это не проблема кода и не проблема wxWidgets, который тут вообще сбоку припёка и никак не относится к сути обработки потоков. проблема в твоём полном непонимании языка С++ и его конструкций. в общем, тебе для начала надо научиться понимать С и С++. а потом лезть в дебри.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.