home *** CD-ROM | disk | FTP | other *** search
/ OpenStep 4.2J (Developer) / os42jdev.iso / NextDeveloper / Examples / NEXTIME / NullVideoCodec / NullDecoder.m < prev    next >
Text File  |  1996-06-24  |  5KB  |  146 lines

  1. #import <architecture/byte_order.h>
  2. #import "NullDecoder.h"
  3. #import <NEXTIME/NTValueDictionary.h>
  4. #import <NEXTIME/NTDictionaryKeys.h>
  5.  
  6. #define NULLVIDEO_COMPONENT_VERSION        0
  7. #define NULLVIDEO_COMPONENT_REVISION_LEVEL    0
  8. #define NULLVIDEO_VENDOR            @"NeXT Computer, Inc."
  9. #define NULLVIDEO_TEMPORAL_QUALITY        1.0
  10. #define NULLVIDEO_SPATIAL_QUALITY        1.0
  11. #define NULLVIDEO_HRES                72.0
  12. #define NULLVIDEO_VRES                72.0
  13. #define NULLVIDEO_COLORSPACE            NSDeviceRGBColorSpace
  14.  
  15. // Rowbytes are assumed to be a multiple of 8 bytes
  16. #define AdjustedRowbytes(r)    (((r) + 7) & ~7)
  17. #define HeightPad    4
  18.  
  19. @implementation NullDecoder
  20.  
  21. - (bycopy NSDictionary *) setConfiguration:
  22.         (bycopy NSDictionary *) inconf
  23. {
  24.     NSMutableDictionary *conf, *output;
  25.     NSDictionary *input;
  26.     NSString * pixelEncoding;
  27.  
  28.     input = [inconf objectForKey: NTSampleInput];
  29.     if (!input || ![inconf objectForKey: NTSampleOutput])
  30.     return nil;
  31.  
  32.     output = [[inconf objectForKey: NTSampleOutput] mutableCopyWithZone:zone];
  33.     conf = [inconf mutableCopyWithZone:zone];
  34.     [conf setObject:output forKey:NTSampleOutput];
  35.     [output release]; // retained by conf
  36.     [conf autorelease];
  37.     
  38.     /* Find appropriate format.  We only support 32 bit RGBX data. */
  39.     if ( (pixelEncoding = [output objectForKey: NTPixelEncoding]) == nil
  40.         || [NTPixel_RGBX8888 isEqualToString:pixelEncoding] == NO ) {
  41.         [output setObject: NTPixel_RGBX8888 forKey: NTPixelEncoding];
  42.     }
  43.     
  44.     /* Ensure that the scaling is appropriate */
  45.     sWidth  = [input integerForKey:NTWidth];
  46.     sHeight = [input integerForKey:NTHeight];
  47.     dWidth  = [output integerForKey:NTWidth];
  48.     dHeight = [output integerForKey:NTHeight];
  49.  
  50.     /* We don't support resizing in the decompressor */
  51.     if (dWidth != sWidth || dHeight != sHeight) {
  52.     [output setInteger:sWidth forKey:NTWidth];
  53.     [output setInteger:sHeight forKey:NTHeight];
  54.     }
  55.  
  56.     return [super setConfiguration: conf];
  57. }
  58.  
  59. - (BOOL) finalizeConfiguration
  60. {
  61.     int depth, width;
  62.  
  63.     sampleDescription = [[config objectForKey: NTSampleOutput]
  64.                     mutableCopyWithZone:[self zone]];
  65.     [sampleDescription setInteger:NULLVIDEO_COMPONENT_VERSION forKey:NTComponentVersion];
  66.     [sampleDescription setInteger:NULLVIDEO_COMPONENT_REVISION_LEVEL forKey:NTComponentRevisionLevel];
  67.     [sampleDescription setObject: NULLVIDEO_VENDOR
  68.         forKey: NTVendor];
  69.     [sampleDescription setDouble:NULLVIDEO_TEMPORAL_QUALITY forKey:NTTemporalQuality];
  70.     [sampleDescription setDouble:NULLVIDEO_SPATIAL_QUALITY forKey:NTSpatialQuality];
  71.     [sampleDescription setDouble:NULLVIDEO_HRES forKey:NTHorizontalResolution];
  72.     [sampleDescription setDouble:NULLVIDEO_VRES forKey:NTVerticalResolution];
  73.     depth = strlen( [sampleDescription cStringForKey:NTPixelEncoding] );
  74.     width = [sampleDescription integerForKey:NTWidth];
  75.     [sampleDescription setInteger:depth forKey:NTBitsPerPixel];
  76.     [sampleDescription setInteger:AdjustedRowbytes(((width * depth) + 7) / 8) forKey:NTBytesPerRow];
  77.     [sampleDescription setObject:NULLVIDEO_COLORSPACE forKey:NTColorSpace];
  78.     
  79.     return YES;
  80.  
  81. - (void)dealloc
  82. {
  83.      if ( sampleDescription )
  84.         [sampleDescription release];
  85.     if ( frameBuffer )
  86.         [frameBuffer release];
  87.  
  88.     [super dealloc];
  89. }
  90.  
  91.  static void
  92. null_decode( const unsigned int *sptr, unsigned int *dptr,
  93.         int dWidth, int dHeight, int drb )
  94. {
  95.     int x, y;
  96.     // Simple-minded pixel copier that honors rowbytes
  97.     for (y = 0; y < dHeight; ++y)
  98.     {
  99.         for (x = 0; x < dWidth; ++x)
  100.         {
  101.         *dptr++ = *sptr++;
  102.         }
  103.         dptr += ((drb / sizeof *dptr) - dWidth);
  104.     }
  105. }
  106.  
  107. - (void)processSamplesFrom: (NTSampleBuffer *)src
  108.     to: (NTMutableSampleBuffer *) dst
  109. {
  110.     const unsigned int *sptr = [src bytes];
  111.     unsigned int *dptr = [dst mutableBytes];
  112.     int drb = [[dst sampleDescription] integerForKey:NTBytesPerRow];
  113.  
  114.     null_decode(sptr, dptr, dWidth, dHeight, drb); 
  115. }
  116.  
  117. - (NTMutableSampleBuffer *) outputBufferForInput: (NTSampleBuffer *) buf
  118. {
  119.     int rowBytes;
  120.     int height;
  121.     NTMutableSampleBuffer *out;
  122.     
  123.     height = [sampleDescription integerForKey:NTHeight];
  124.     rowBytes = [sampleDescription integerForKey:NTBytesPerRow];
  125.     if ( frameBuffer == nil )
  126.     {
  127.         frameBuffer = [[NSMutableData allocWithZone:zone]
  128.                 initWithLength:height * rowBytes];
  129.     }
  130.     out = [[NTMutableSampleBuffer allocWithZone:zone]
  131.             initSampleWithDataNoCopy: frameBuffer
  132.             dataOffset        : 0 
  133.             sampleSize        : height * rowBytes
  134.             startingTime    : [buf startingTime]
  135.             sampleDuration    : [buf sampleDuration]
  136.             sampleCount        : 1
  137.             sampleDescription    : sampleDescription 
  138.             sampleFlags        : NTSyncSample
  139.             trackID        : [buf trackID]
  140.             sequenceNumber    : [buf sequenceNumber] ];
  141.     return [out autorelease];
  142. }
  143.  
  144. @end
  145.