av_read_frame() 개인적인 메소드

private av_read_frame ( IntPtr s, IntPtr pkt ) : Int32
s IntPtr
pkt IntPtr
리턴 System.Int32
예제 #1
0
        public IAVFrame GetNext()
        {
            IAVFrame frame   = null;
            IntPtr   pPacket = Marshal.AllocHGlobal(Marshal.SizeOf(new AV.AVPacket()));

            if (AV.av_read_frame(rawFormatCtx, pPacket) != 0)
            {
                Marshal.FreeHGlobal(pPacket);
                pPacket = IntPtr.Zero;
                return(null);
            }


            AV.AVPacket packet = new NativeGetter <AV.AVPacket>(pPacket).Get();
            if (!decoderTable.ContainsKey(packet.stream_index) ||
                !mediaTypeTable.ContainsKey(packet.stream_index))
            {
                Marshal.FreeHGlobal(pPacket);
                pPacket = IntPtr.Zero;
                return(null);
            }

            var codec = decoderTable[packet.stream_index];
            var type  = mediaTypeTable[packet.stream_index];

            switch (type)
            {
            case AV.AVMediaType.AVMEDIA_TYPE_AUDIO:
                frame = new AudioFrame(pPacket, codec);
                return(frame);

            case AV.AVMediaType.AVMEDIA_TYPE_VIDEO:
                frame = new VideoFrame(pPacket, codec);
                return(frame);

            default:
                throw new Exception("Not support media type " + type.ToString());
            }
            return(null);
        }