Ejemplo n.º 1
0
        /// <summary>
        /// <see cref="sws_getCachedContext(SwsContext*, int, int, AVPixelFormat, int, int, AVPixelFormat, int, SwsFilter*, SwsFilter*, double*)"/>
        /// <see cref="sws_scale(SwsContext*, byte*[], int[], int, int, byte*[], int[])"/>
        /// </summary>
        public static IEnumerable <Frame> ConvertFrames(this CodecContext c, IEnumerable <Frame> sourceFrames, ScaleFlag flags = ScaleFlag.Bilinear)
        {
            using var destFrame = c.CreateFrame();
            int pts = 0;

            if (c.Codec.Type == MediaType.Video)
            {
                using var frameConverter = new FrameConverter();
                foreach (var sourceFrame in sourceFrames)
                {
                    frameConverter.ConvertFrame(sourceFrame, destFrame, flags);
                    destFrame.Pts = pts++;
                    yield return(destFrame);
                }
            }
            else if (c.Codec.Type == MediaType.Audio)
            {
                using var frameConverter = new SampleConverter();
                foreach (var sourceFrame in sourceFrames)
                {
                    frameConverter.ConvertFrame(destFrame, sourceFrame);
                    destFrame.Pts = pts += c.FrameSize;
                    yield return(destFrame);
                }
            }
        }
Ejemplo n.º 2
0
        private static void WriteImageTo(Frame frame, FormatContext fc)
        {
            Codec codec       = Codec.FindEncoder(fc.OutputFormat.VideoCodec);
            var   mediaStream = new MediaStream(fc);

            using CodecContext codecContext = new CodecContext(codec)
                  {
                      PixelFormat = codec.PixelFormats.First(),
                      Width       = frame.Width,
                      Height      = frame.Height,
                      TimeBase    = new MediaRational(1, 25),
                      Flags       = fc.OutputFormat.Flags.HasFlag(FormatOutputFlag.Globalheader) ? CodecFlag.GlobalHeader : CodecFlag.None,
                  };
            codecContext.Open(codec);
            mediaStream.Codecpar.CopyFrom(codecContext);

            if ((PixelFormat)frame.Format == codecContext.PixelFormat)
            {
                WriteAction(frame, fc, codecContext);
            }
            else
            {
                using var tempFrame      = Frame.CreateWritableVideo(frame.Width, frame.Height, codecContext.PixelFormat);
                using var frameConverter = new FrameConverter();
                frameConverter.ConvertFrame(frame, tempFrame);
                WriteAction(tempFrame, fc, codecContext);
            }
        }
Ejemplo n.º 3
0
 private static void WriteAction(Frame frame, FormatContext fc, CodecContext codecContext)
 {
     fc.WriteHeader();
     foreach (Packet packet in codecContext.EncodeFrames(new[] { frame }))
     {
         fc.WritePacket(packet);
     }
     fc.WriteTrailer();
 }
Ejemplo n.º 4
0
		internal MediaStream (IntPtr ptr)
		{
			if (ptr == IntPtr.Zero)
				throw new ArgumentException ("Null pointer");

			this.ptr = ptr;
			this.stream = (AVStream*)ptr;

			Language = Marshal.PtrToStringAnsi (new IntPtr (this.stream->language));
			CodecContext = new CodecContext ((IntPtr)this.stream->codec);
		}
Ejemplo n.º 5
0
		internal Codec (IntPtr ptr, CodecContext context)
		{
			if (context == null)
				throw new ArgumentNullException ("context");
			if (ptr == IntPtr.Zero)
				throw new ArgumentException ("Null pointer");

			this.ptr = ptr;
			this.context = context;
			this.codec = (AVCodec*)ptr;

			Name = Marshal.PtrToStringAnsi ((IntPtr)this.codec->name);
		}
 /// <summary>
 /// <see cref="av_read_frame(AVFormatContext*, AVPacket*)"/>
 /// </summary>
 public CodecResult ReadFrame(Packet packet) => CodecContext.ToCodecResult(av_read_frame(this, packet));