/// <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);
            }
        }
Пример #2
0
 public static extern void MFInitMediaTypeFromMPEG2VideoInfo(
     [In] IMFMediaType pMFType,
     Mpeg2VideoInfo pMP2VI,
     [In] int cbBufSize,
     [In, MarshalAs(UnmanagedType.LPStruct)] Guid pSubtype
     );
Пример #3
0
  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);
        }
Пример #5
0
    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);
    }