void initVideoDecoder(Constants.AVCodecID avCodecID)
 {
     if (_codecId != avCodecID)
     {
         _codecId = avCodecID;
         tryOnInitHeader();
     }
 }
Esempio n. 2
0
        private void fireOnFFMPEGFormat(Constants.AVCodecID codecID, int width, int height)
        {
            OnFFMPEGFormat callback = FFMPEGFormatEvent;

            if (callback != null)
            {
                callback(codecID, width, height);
            }
        }
Esempio n. 3
0
 public static IntPtr VideoDecoder_Create(Constants.AVCodecID videoCodecID)
 {
     if (_isX64)
     {
         return(FFmpeg64.VideoDecoder_Create(videoCodecID));
     }
     else
     {
         return(FFmpeg32.VideoDecoder_Create(videoCodecID));
     }
 }
Esempio n. 4
0
        public void Init(Constants.AVCodecID codecID, int width, int height)
        {
            if (_decoder == null || _codecId != codecID || _width != width || _Height != height)
            {
                Release();

                _decoder = new VideoDecoder();
                _decoder.Create(codecID);
                _codecId = codecID;
                _width   = width;
                _Height  = height;
            }
        }
Esempio n. 5
0
        private void video_FFMPEGFormatEvent(Constants.AVCodecID codecID, int width, int height)
        {
            _ffmpegCodecId = codecID;
            _ffmpegWidth   = width;
            _ffmpegHeight  = height;
            FfmpegHeader header = new FfmpegHeader()
            {
                CodecID = codecID,
                Width   = width,
                Height  = height
            };

            FfmpegHeader = header;
            onFfmpegHeaderReceived(new FfmpegHeaderEventArgs(header));
        }
Esempio n. 6
0
        private byte[] decodeBC(byte[] buffer, int index)                                               //PS流的节目映射流部分(节目流映射)
        {
            int program_stream_map_length = readUshort(buffer, index);                                  //节目流映射长度字段,16位字段。指示紧跟在该字段后的program_stream_map中的字节数。

            index += 2;                                                                                 //program_stream_map_length
            if (program_stream_map_length > 0x3fa || buffer.Length < index + program_stream_map_length) //该字段的最大值为1018(0x3FA)。
            {
                return(null);
            }
            index += 2;                                                   //当前下一个指示符字段 + 节目流映射版本字段 + 标记位字段
            int program_stream_info_length = readUshort(buffer, index);   //节目流信息长度字段

            index += 2;                                                   //ushort(program_stream_info_length)
            index += program_stream_info_length;
            int elementary_stream_map_length = readUshort(buffer, index); //基本流映射长度字段,16位字段,指出在该节目流映射中的所有基本流信息的字节长度。

            //它只包括stream_type、elementary_stream_id和elementary_stream_info_length字段。(这里注意一下,这里的基本流映射长度,它只包括他后面的指定的那几个定义字段的总和,即从从这个长度,我们可以知道后面它根了几种类型的流定义,因为一种流的这个定义字段:stream_type(1BYTE)、elementary_stream_id(1BYTE)和elementary_stream_info_length(2BYTE)字段总和为4个字节,所以用elementary_stream_map_length /4 可以得到后面定义了几个流类型信息。)
            index += 2;                     //elementary_stream_map_length
            int streamType = buffer[index]; //

            switch (streamType)
            {
            case 0x10:    //MPEG-4 视频流
                CodecID = Constants.AVCodecID.AV_CODEC_ID_MPEG4;
                break;

            case 0x1B:    //H.264 视频流
                CodecID = Constants.AVCodecID.AV_CODEC_ID_H264;
                break;

            case 0x80:    //SVAC 视频流
                break;

            case 0x90:    //G.711 音频流
            case 0x92:    //G.722.1 音频流
            case 0x93:    //G.723.1 音频流
            case 0x99:    //G.729 音频流
            case 0x9B:    //SVAC音频流
                break;
            }
            return(null);
        }
Esempio n. 7
0
 public bool Create(Constants.AVCodecID videoCodecID)
 {
     _decoder = NativeMethods.VideoDecoder_Create(videoCodecID);
     return(IsOpen);
 }
Esempio n. 8
0
 public bool Create(string fileName, int width, int height, Constants.AVCodecID videoCodecID, int bitRate)
 {
     _file = NativeMethods.FileBuilder_Create(fileName, width, height, videoCodecID, bitRate);
     return(IsOpen);
 }
Esempio n. 9
0
 public CodeIdEventArgs(Constants.AVCodecID old, Constants.AVCodecID ne)
 {
     OldId = old;
     NewId = ne;
 }
Esempio n. 10
0
 private void onCodeIdChanged(Constants.AVCodecID old, Constants.AVCodecID ne)
 {
     CodeIdChanged?.Invoke(this, new CodeIdEventArgs(old, ne));
 }
Esempio n. 11
0
 public FfmpegStreamDecoder(Constants.AVCodecID codecId, int width, int height)
 {
     _decoder = new FfmpegDecoder();
     _decoder.Init(codecId, width, height);
 }
Esempio n. 12
0
 public static extern IntPtr VideoDecoder_Create([MarshalAs(UnmanagedType.I4)] Constants.AVCodecID videoCodecID);
Esempio n. 13
0
 public static extern IntPtr FileBuilder_Create([MarshalAs(UnmanagedType.LPStr)] string fileName, int width, int height, [MarshalAs(UnmanagedType.I4)] Constants.AVCodecID videoCodecID, int bitRate);
Esempio n. 14
0
 public static IntPtr FileBuilder_Create(string fileName, int width, int height, Constants.AVCodecID videoCodecID, int bitRate)
 {
     if (_isX64)
     {
         return(FFmpeg64.FileBuilder_Create(fileName, width, height, videoCodecID, bitRate));
     }
     else
     {
         return(FFmpeg32.FileBuilder_Create(fileName, width, height, videoCodecID, bitRate));
     }
 }
Esempio n. 15
0
        private void _connection_MessageEvent(byte[] message)
        {
            MessageReader mr = new MessageReader(message);

            //Console.WriteLine(mr.MessageID.ToString("X"));
            switch (mr.MessageID)
            {
            case 0x11024:     // Msg_Video_Login_Accept
                getVideo();
                fireOnVideoConnected();
                break;

            case 0x11025:     // Msg_Video_Login_Reject
                _videoEvent.Set();
                break;

            case 0x12012:     // Msg_Video_Bandwidth
            {
                int  band1  = mr.Reader.ReadInt32();
                int  band2  = mr.Reader.ReadInt32();
                int  band3  = mr.Reader.ReadInt32();
                bool urgent = mr.Reader.ReadInt32() != 0;
                if (band3 > 0)
                {
                    setVideoLevel(3);
                }
                else if (band2 > 0)
                {
                    setVideoLevel(2);
                }
                else if (band1 > 0)
                {
                    setVideoLevel(1);
                }
                else
                {
                    setVideoLevel(0);
                }
            }
            break;

            case 0x12123:     // Msg_HikM4_Package2
            {
                int level = mr.Reader.ReadInt32();
                if (level == _videoLevel)
                {
                    int    frameType = mr.Reader.ReadInt32();
                    int    size      = mr.Reader.ReadInt32();
                    byte[] frameData = mr.Reader.ReadBytes(size);

                    _lastRecvTime = DateTime.Now;
                    fireOnVideoStream(frameType, frameData);

                    if (_decode)
                    {
                        _hikm4Decoder.InputData(frameType, frameData);
                    }
                }
            }
            break;

            case 0x12025:     // Msg_Ffmpeg_Format
            {
                int level = mr.Reader.ReadInt32();
                if (level == _videoLevel)
                {
                    _lastRecvTime = DateTime.Now;
                    Constants.AVCodecID codecID = (Constants.AVCodecID)mr.Reader.ReadInt32();
                    int width  = mr.Reader.ReadInt32();
                    int height = mr.Reader.ReadInt32();

                    fireOnFFMPEGFormat(codecID, width, height);

                    if (_decode)
                    {
                        _ffmpegDecoder.Init(codecID, width, height);
                    }
                }
            }
            break;

            case 0x12026:     // Msg_Ffmpeg_Frame
            {
                int level = mr.Reader.ReadInt32();
                if (level == _videoLevel)
                {
                    _lastRecvTime = DateTime.Now;
                    int    type  = mr.Reader.ReadInt32();
                    ulong  pts   = mr.Reader.ReadUInt64();
                    int    size  = mr.Reader.ReadInt32();
                    byte[] bytes = new byte[size];
                    mr.Reader.Read(bytes, 0, size);

                    fireOnFFMPEGFrame(type, pts, bytes);

                    if (_decode)
                    {
                        var frame = _ffmpegDecoder.Decode(type, pts, bytes);
                        if (frame != null)
                        {
                            fireOnVideoFrame(frame.Width, frame.Height, frame.Data, (int)frame.Pts);
                        }
                    }
                }
            }
            break;

            case 0x12027:     // Msg_Uniview_Package
            {
                string decodeTag = mr.Reader.ReadString();
                int    size      = mr.Reader.ReadInt32();
                byte[] data      = mr.Reader.ReadBytes(size);

                fireOnUniviewData(decodeTag, data);

                if (_decode)
                {
                    _univiewDecoder.InputData(decodeTag, data);
                }
            }
            break;

            case 0x12511:     // Msg_Transparent_Recv
            {
                int    length = mr.Reader.ReadInt32();
                byte[] data   = new byte[length];
                mr.Reader.Read(data, 0, length);
                fireOnResponseData(data);
            }
            break;
            }
        }