/// <summary> /// Sets AMMediaType format data with Mpeg2VideoInfo and optional extra data. /// </summary> /// <param name="vi"></param> /// <param name="extraData"></param> /// <param name="amt"></param> static void SetFormat(Mpeg2VideoInfo vi, byte[] extraData, AMMediaType amt) { int cb = Marshal.SizeOf(vi); int add = extraData == null || extraData.Length < 4 ? 0 : extraData.Length - 4; IntPtr ptr = Marshal.AllocCoTaskMem(cb + add); try { Marshal.StructureToPtr(vi, ptr, false); if (extraData != null) { Marshal.Copy(extraData, 0, ptr + cb - 4, extraData.Length); } amt.SetFormat(ptr, cb + add); amt.formatType = FormatType.Mpeg2Video; } finally { Marshal.FreeCoTaskMem(ptr); } }
public static extern void MFInitMediaTypeFromMPEG2VideoInfo( [In] IMFMediaType pMFType, Mpeg2VideoInfo pMP2VI, [In] int cbBufSize, [In, MarshalAs(UnmanagedType.LPStruct)] Guid pSubtype );
public static int Main(string[] args) { string file1 = args[0]; Mpeg2VideoInfo info = new Mpeg2VideoInfo(file1); System.Console.WriteLine( info.StartTime ); System.Console.WriteLine( info.EndTime ); System.Console.WriteLine( info.Duration ); System.Console.WriteLine( info.AspectRatio ); System.Console.WriteLine( info.FrameRate ); System.Console.WriteLine( info.PictureWidth ); System.Console.WriteLine( info.PictureHeight ); ImageReader r = new ImageReader(); //Image image = new Image(); Image image = r.GetImage(); image.SetNumberOfDimensions( 3 ); DataElement pixeldata = new DataElement( new gdcm.Tag(0x7fe0,0x0010) ); System.IO.FileStream infile = new System.IO.FileStream(file1, System.IO.FileMode.Open, System.IO.FileAccess.Read); uint fsize = gdcm.PosixEmulation.FileSize(file1); byte[] jstream = new byte[fsize]; infile.Read(jstream, 0 , jstream.Length); SmartPtrFrag sq = SequenceOfFragments.New(); Fragment frag = new Fragment(); frag.SetByteValue( jstream, new gdcm.VL( (uint)jstream.Length) ); sq.AddFragment( frag ); pixeldata.SetValue( sq.__ref__() ); // insert: image.SetDataElement( pixeldata ); PhotometricInterpretation pi = new PhotometricInterpretation( PhotometricInterpretation.PIType.YBR_PARTIAL_420 ); image.SetPhotometricInterpretation( pi ); // FIXME hardcoded: PixelFormat pixeltype = new PixelFormat(3,8,8,7); image.SetPixelFormat( pixeltype ); // FIXME hardcoded: TransferSyntax ts = new TransferSyntax( TransferSyntax.TSType.MPEG2MainProfile); image.SetTransferSyntax( ts ); image.SetDimension(0, (uint)info.PictureWidth); image.SetDimension(1, (uint)info.PictureHeight); image.SetDimension(2, 721); ImageWriter writer = new ImageWriter(); gdcm.File file = writer.GetFile(); file.GetHeader().SetDataSetTransferSyntax( ts ); Anonymizer anon = new Anonymizer(); anon.SetFile( file ); MediaStorage ms = new MediaStorage( MediaStorage.MSType.VideoEndoscopicImageStorage); UIDGenerator gen = new UIDGenerator(); anon.Replace( new Tag(0x0008,0x16), ms.GetString() ); anon.Replace( new Tag(0x0018,0x40), "25" ); anon.Replace( new Tag(0x0018,0x1063), "40.000000" ); anon.Replace( new Tag(0x0028,0x34), "4\\3" ); anon.Replace( new Tag(0x0028,0x2110), "01" ); writer.SetImage( image ); writer.SetFileName( "dummy.dcm" ); if( !writer.Write() ) { System.Console.WriteLine( "Could not write" ); return 1; } return 0; }
/// <summary> /// AVC1 formatted H264 bitstream /// </summary> /// <param name="streamInfo"></param> /// <returns></returns> public static AMMediaType H264_AVC1(InputstreamInfo streamInfo) { H264CodecData codecData = null; Mpeg2VideoInfo vi = new Mpeg2VideoInfo(); byte[] extraData = new byte[0]; int width = (int)streamInfo.Width; int height = (int)streamInfo.Height; if (streamInfo.ExtraData.Length > 0) { codecData = new H264CodecData(streamInfo.ExtraData); SPSUnit spsUnit = new SPSUnit(codecData.SPS); width = spsUnit.Width(); height = spsUnit.Height(); } vi.hdr.SrcRect.right = width; vi.hdr.SrcRect.bottom = height; vi.hdr.TargetRect.right = width; vi.hdr.TargetRect.bottom = height; int hcf = HCF(width, height); vi.hdr.PictAspectRatioX = width / hcf; vi.hdr.PictAspectRatioY = height / hcf; vi.hdr.BmiHeader.Width = width; vi.hdr.BmiHeader.Height = height; vi.hdr.BmiHeader.Planes = 1; vi.hdr.BmiHeader.Compression = FOURCC_AVC1; vi.hdr.BmiHeader.BitCount = 24; if (codecData != null) { vi.dwProfile = (uint)codecData.Profile; vi.dwLevel = (uint)codecData.Level; vi.dwFlags = (uint)codecData.NALSizeMinusOne + 1; extraData = NaluParser.CreateAVC1ParameterSet(codecData.SPS, codecData.PPS, 2); } else { // Example: avc1.4D401F -> Main Level 3.1 // Profile Value // Baseline 42E0 // Main 4D40 // High 6400 // Extended 58A0 // Level Hex Value // 3.0 1E // 3.1 1F // 4.1 29 // 5.1 33 string codecInfo = streamInfo.CodecInternalName.Split('.').Last(); if (codecInfo.Length == 6) { int codecNum; if (int.TryParse(codecInfo.Substring(0, 2), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out codecNum)) { vi.dwProfile = (uint)codecNum; } if (int.TryParse(codecInfo.Substring(4, 2), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out codecNum)) { vi.dwLevel = (uint)codecNum; } } } vi.cbSequenceHeader = (uint)extraData.Length; AMMediaType amt = new AMMediaType(); amt.majorType = MediaType.Video; amt.subType = MEDIASUBTYPE_AVC1; amt.temporalCompression = true; amt.fixedSizeSamples = false; amt.sampleSize = 1; SetFormat(vi, extraData, amt); return(amt); }
public static int Main(string[] args) { string file1 = args[0]; Mpeg2VideoInfo info = new Mpeg2VideoInfo(file1); System.Console.WriteLine(info.StartTime); System.Console.WriteLine(info.EndTime); System.Console.WriteLine(info.Duration); System.Console.WriteLine(info.AspectRatio); System.Console.WriteLine(info.FrameRate); System.Console.WriteLine(info.PictureWidth); System.Console.WriteLine(info.PictureHeight); ImageReader r = new ImageReader(); //Image image = new Image(); Image image = r.GetImage(); image.SetNumberOfDimensions(3); DataElement pixeldata = new DataElement(new gdcm.Tag(0x7fe0, 0x0010)); System.IO.FileStream infile = new System.IO.FileStream(file1, System.IO.FileMode.Open, System.IO.FileAccess.Read); uint fsize = gdcm.PosixEmulation.FileSize(file1); byte[] jstream = new byte[fsize]; infile.Read(jstream, 0, jstream.Length); SmartPtrFrag sq = SequenceOfFragments.New(); Fragment frag = new Fragment(); frag.SetByteValue(jstream, new gdcm.VL((uint)jstream.Length)); sq.AddFragment(frag); pixeldata.SetValue(sq.__ref__()); // insert: image.SetDataElement(pixeldata); PhotometricInterpretation pi = new PhotometricInterpretation(PhotometricInterpretation.PIType.YBR_PARTIAL_420); image.SetPhotometricInterpretation(pi); // FIXME hardcoded: PixelFormat pixeltype = new PixelFormat(3, 8, 8, 7); image.SetPixelFormat(pixeltype); // FIXME hardcoded: TransferSyntax ts = new TransferSyntax(TransferSyntax.TSType.MPEG2MainProfile); image.SetTransferSyntax(ts); image.SetDimension(0, (uint)info.PictureWidth); image.SetDimension(1, (uint)info.PictureHeight); image.SetDimension(2, 721); ImageWriter writer = new ImageWriter(); gdcm.File file = writer.GetFile(); file.GetHeader().SetDataSetTransferSyntax(ts); Anonymizer anon = new Anonymizer(); anon.SetFile(file); MediaStorage ms = new MediaStorage(MediaStorage.MSType.VideoEndoscopicImageStorage); UIDGenerator gen = new UIDGenerator(); anon.Replace(new Tag(0x0008, 0x16), ms.GetString()); anon.Replace(new Tag(0x0018, 0x40), "25"); anon.Replace(new Tag(0x0018, 0x1063), "40.000000"); anon.Replace(new Tag(0x0028, 0x34), "4\\3"); anon.Replace(new Tag(0x0028, 0x2110), "01"); writer.SetImage(image); writer.SetFileName("dummy.dcm"); if (!writer.Write()) { System.Console.WriteLine("Could not write"); return(1); } return(0); }