Warning, file /multimedia/k3b/libk3b/projects/videocd/mpeginfo/k3bmpeginfo.h was not indexed or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).

0001 /*
0002     SPDX-FileCopyrightText: 2003-2004 Christian Kvasny <chris@k3b.org>
0003     SPDX-FileCopyrightText: 1998-2007 Sebastian Trueg <trueg@k3b.org>
0004 
0005     SPDX-License-Identifier: GPL-2.0-or-later
0006 */
0007 
0008 #ifndef K3BMPEGINFO
0009 #define K3BMPEGINFO
0010 
0011 #include <stdio.h>
0012 
0013 // #define BUFFERSIZE   16384
0014 #define BUFFERSIZE   65536
0015 
0016 #define MPEG_START_CODE_PATTERN  ((ulong) 0x00000100)
0017 #define MPEG_START_CODE_MASK     ((ulong) 0xffffff00)
0018 
0019 #define MPEG_PICTURE_CODE        ((ulong) 0x00000100)
0020 /* [...slice codes... 0x1a7] */
0021 
0022 #define MPEG_USER_CODE           ((uchar) 0xb2)
0023 #define MPEG_SEQUENCE_CODE       ((uchar) 0xb3)
0024 #define MPEG_EXT_CODE            ((uchar) 0xb5)
0025 #define MPEG_SEQ_END_CODE        ((uchar) 0xb7)
0026 #define MPEG_GOP_CODE            ((uchar) 0xb8)
0027 #define MPEG_PROGRAM_END_CODE    ((uchar) 0xb9)
0028 #define MPEG_PACK_HEADER_CODE    ((uchar) 0xba)
0029 #define MPEG_SYSTEM_HEADER_CODE  ((uchar) 0xbb)
0030 #define MPEG_PRIVATE_1_CODE      ((uchar) 0xbd)
0031 #define MPEG_PAD_CODE            ((uchar) 0xbe)
0032 
0033 #define MPEG_AUDIO_C0_CODE       ((uchar) 0xc0) /* default */
0034 #define MPEG_AUDIO_C1_CODE       ((uchar) 0xc1) /* 2nd audio stream id (dual channel) */
0035 #define MPEG_AUDIO_C2_CODE       ((uchar) 0xc2) /* 3rd audio stream id (surround sound) */
0036 
0037 #define MPEG_VIDEO_E0_CODE       ((uchar) 0xe0) /* motion */
0038 #define MPEG_VIDEO_E1_CODE       ((uchar) 0xe1) /* lowres still */
0039 #define MPEG_VIDEO_E2_CODE       ((uchar) 0xe2) /* hires still */
0040 
0041 #define FLOAT_0x10000 (double)((unsigned long)1 << 16)
0042 #define STD_SYSTEM_CLOCK_FREQ (unsigned long)90000
0043 
0044 typedef unsigned char byte;
0045 typedef long long llong;
0046 
0047 #include <QDebug>
0048 
0049 namespace K3b {
0050     class video_info
0051     {
0052     public:
0053         bool seen;
0054         unsigned long hsize;
0055         unsigned long vsize;
0056         double aratio;
0057         double frate;
0058         unsigned long bitrate;
0059         unsigned long vbvsize;
0060         bool progressive;
0061         unsigned char video_format;
0062         unsigned char chroma_format;
0063         bool constrained_flag;
0064     };
0065 
0066 
0067     class audio_info
0068     {
0069     public:
0070         bool seen;
0071         unsigned int version;
0072         unsigned int layer;
0073         unsigned int protect;
0074         unsigned long bitrate;
0075         float byterate;
0076         unsigned long sampfreq;
0077         int mode;
0078         bool copyright;
0079         bool original;
0080     };
0081 
0082 
0083     class Mpeginfo
0084     {
0085 
0086     public:
0087         Mpeginfo()
0088             : version( 0 ),
0089               muxrate( 0 ),
0090               playing_time( 0 ),
0091               has_video ( false ),
0092               has_audio ( false )
0093         {
0094             for ( int i = 0; i < 3; i++ ) {
0095                 video[ i ].seen = false;
0096                 audio[ i ].seen = false;
0097             }
0098         };
0099 
0100         ~Mpeginfo()
0101         {}
0102         ;
0103 
0104         unsigned int version;
0105         unsigned long muxrate;
0106         double playing_time;
0107         bool has_video;
0108         bool has_audio;
0109         video_info video[ 3 ];
0110         audio_info audio[ 3 ];
0111     };
0112 
0113     class MpegInfo
0114     {
0115     public:
0116         explicit MpegInfo( const char* filename );
0117         ~MpegInfo();
0118         enum mpeg_version { MPEG_VERS_INVALID = 0, MPEG_VERS_MPEG1 = 1, MPEG_VERS_MPEG2 = 2 };
0119         enum mode { MPEG_STEREO = 1, MPEG_JOINT_STEREO, MPEG_DUAL_CHANNEL, MPEG_SINGLE_CHANNEL };
0120 
0121         int version()
0122         {
0123             return mpeg_info->version;
0124         };
0125         const QString error_string()
0126         {
0127             return m_error_string;
0128         };
0129         Mpeginfo* mpeg_info;
0130 
0131 
0132     private:
0133         //  General ToolBox
0134         byte GetByte( llong offset );
0135         byte bdGetByte( llong offset );
0136         llong GetNBytes( llong, int );
0137         unsigned short int GetSize( llong offset );
0138         llong FindNextMarker( llong );
0139         llong FindNextMarker( llong, byte* );
0140         llong FindNextMarker( llong, byte );
0141         llong bdFindNextMarker( llong, byte );
0142         llong bdFindNextMarker( llong, byte* );
0143         llong FindNextVideo( llong );
0144         llong FindNextAudio( llong );
0145 
0146         int GetVideoIdx ( byte );
0147         int GetAudioIdx ( byte );
0148         bool EnsureMPEG( llong, byte );
0149         void ParseVideo ( llong, byte );
0150         void ParseAudio ( llong, byte );
0151         bool MpegParsePacket ();
0152         llong MpegParsePacket ( llong );
0153         llong SkipPacketHeader( llong );
0154 
0155         double ReadTS( llong offset );
0156         double ReadTSMpeg2( llong offset );
0157 
0158         FILE* m_mpegfile;
0159 
0160         const char* m_filename;
0161         llong m_filesize;
0162 
0163         bool m_done;
0164 
0165         llong m_buffstart;
0166         llong m_buffend;
0167         byte* m_buffer;
0168         double m_initial_TS;
0169         QString m_error_string;
0170 
0171     };
0172 }
0173 
0174 #endif //MpegInfo