private void InitEs() { try { ioContext = ffmpegGlue.AllocIOContext(BufferSize, ReadPacket); ioContext.Seekable = false; ioContext.WriteFlag = false; formatContext = ffmpegGlue.AllocFormatContext(); formatContext.ProbeSize = ProbeSize; formatContext.MaxAnalyzeDuration = MaxAnalyzeDuration; formatContext.AVIOContext = ioContext; formatContext.Open(); } catch (FFmpegException ex) { DeallocFFmpeg(); // Report init errors resulting from reset as cancellation if (cancellationTokenSource.IsCancellationRequested) { throw new TaskCanceledException(); } Logger.Error(ex); throw new DemuxerException("Cannot open formatContext", ex); } }
public void Initialize() { try { Interop.FFmpeg.av_register_all(); Interop.FFmpeg.avformat_network_init(); unsafe { Interop.FFmpeg.av_log_set_level(FFmpegMacros.AV_LOG_INFO); Interop.av_log_set_callback_callback logCallback = (p0, level, format, vl) => { if (level > Interop.FFmpeg.av_log_get_level()) { return; } const int lineSize = 1024; var lineBuffer = stackalloc byte[lineSize]; var printPrefix = 1; Interop.FFmpeg.av_log_format_line(p0, level, format, vl, lineBuffer, lineSize, &printPrefix); var line = Marshal.PtrToStringAnsi((IntPtr)lineBuffer); Logger.Warn(line); }; Interop.FFmpeg.av_log_set_callback(logCallback); } } catch (Exception e) { Logger.Error(e, "Could not load and register FFmpeg library"); throw new DemuxerException("Could not load and register FFmpeg library", e); } }
private void FindStreamsInfo() { try { formatContext.FindStreamInfo(); SelectBestStreams(); } catch (FFmpegException ex) { Logger.Error(ex); DeallocFFmpeg(); throw new DemuxerException("Cannot find streams info", ex); } }
private void InitUrl(string url, IReadOnlyCollection <KeyValuePair <string, object> > options = null) { try { formatContext = ffmpegGlue.AllocFormatContext(); formatContext.IoInterrupt = () => _operationMonitor.CancelOrTimeout(); formatContext.ProbeSize = ProbeSize; formatContext.MaxAnalyzeDuration = TimeSpan.FromSeconds(10); formatContext.Open(url, options == null ? null : new AvDictionary(options)); } catch (FFmpegException ex) { DeallocFFmpeg(); Logger.Error(ex); throw new DemuxerException("Cannot open formatContext", ex); } }
private ArraySegment <byte> ReadPacket(int size) { try { var token = cancellationTokenSource.Token; var data = buffer.Take(size, token); return(data); } catch (TaskCanceledException) { Logger.Info("Take cancelled"); } catch (InvalidOperationException ex) { Logger.Warn(ex); } catch (Exception ex) { Logger.Error(ex, $"Unexpected exception: {ex.GetType()}"); } return(new ArraySegment <byte>()); }
public void Prepend(byte[] prependData) { var prependLen = prependData.Length; var orgLen = Packet.size; var pkt = Packet; Span <byte> packetSpan; unsafe { if (Interop.FFmpeg.av_grow_packet(&pkt, prependLen) < 0) { Logger.Error("GrowPacket failed"); return; } packetSpan = new Span <byte>(pkt.data, pkt.size); } // Regions overlap. Copy of source data will be made. packetSpan.Slice(0, orgLen).CopyTo(packetSpan.Slice(prependLen)); prependData.AsSpan().CopyTo(packetSpan); Packet = pkt; }