home *** CD-ROM | disk | FTP | other *** search
/ OpenStep 4.2J (Developer) / os42jdev.iso / NextDeveloper / Examples / NEXTIME / NullVideoCodec / NullEncoder.m < prev    next >
Text File  |  1996-10-15  |  4KB  |  144 lines

  1.  
  2. #import <architecture/byte_order.h>
  3. #import "NullEncoder.h"
  4. #import <NEXTIME/NTValueDictionary.h>
  5. #import <NEXTIME/NTDictionaryKeys.h>
  6. #import <NEXTIME/NTComponent.h>
  7.  
  8. #define NULLVIDEO_COMPONENT_VERSION        0
  9. #define NULLVIDEO_COMPONENT_REVISION_LEVEL    0
  10. #define NULLVIDEO_VENDOR            @"NeXT Computer, Inc."
  11. #define NULLVIDEO_TEMPORAL_QUALITY        1.0
  12. #define NULLVIDEO_SPATIAL_QUALITY        0.75
  13. #define NULLVIDEO_HRES                72.0
  14. #define NULLVIDEO_VRES                72.0
  15. #define NULLVIDEO_BPP                32
  16. #define NULLVIDEO_COLORSPACE            NSDeviceRGBColorSpace
  17.  
  18.  
  19. @implementation NullEncoder
  20.  
  21. - (bycopy NSDictionary *) setConfiguration:
  22.         (bycopy NSDictionary *) inconf 
  23. {
  24.     NSDictionary *output;
  25.     NSMutableDictionary *input, *conf;
  26.     NSString *pixelEncoding;
  27.  
  28.     output = [inconf objectForKey: NTSampleOutput];
  29.     if (![inconf objectForKey: NTSampleInput] || !output)
  30.     return nil;
  31.     input = [[inconf objectForKey: NTSampleInput] mutableCopyWithZone:zone];
  32.     conf = [inconf mutableCopyWithZone:zone];
  33.     [conf setObject:input forKey:NTSampleInput];
  34.     [input release]; // retained by conf
  35.     [conf autorelease];
  36.     
  37.     /* Find appropriate format.  We only support 32 bit RGBX data. */
  38.     if ( (pixelEncoding = [input objectForKey: NTPixelEncoding]) == nil
  39.         || [NTPixel_RGBX8888 isEqualToString:pixelEncoding] == NO ) {
  40.         [input setObject: NTPixel_RGBX8888 forKey: NTPixelEncoding];
  41.     }
  42.  
  43.     width = [output integerForKey:NTWidth];
  44.     height = [output integerForKey:NTHeight];
  45.     if (width  != [input integerForKey:NTWidth])
  46.     [input setInteger:width forKey:NTWidth];
  47.     if (height != [input integerForKey:NTHeight])
  48.     [input setInteger:height forKey:NTHeight];
  49.  
  50.     return [super setConfiguration: conf];
  51. }
  52.  
  53.  
  54. - (void) setupSampleDescription
  55. {
  56.     NSDictionary * componentDict;
  57.  
  58.     componentDict = [[NTComponent componentForClass:[self class]] dictionary];
  59.     sampleDescription = [[NSMutableDictionary alloc] init];
  60.  
  61.     [sampleDescription setObject: NTCompressed
  62.         forKey: NTFormatType];
  63.     [sampleDescription setObject: @"NullVideo"
  64.         forKey: NTFormatSubtype];
  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 setInteger:width forKey:NTWidth];
  72.     [sampleDescription setInteger:height forKey:NTHeight];
  73.     [sampleDescription setDouble:NULLVIDEO_HRES forKey:NTHorizontalResolution];
  74.     [sampleDescription setDouble:NULLVIDEO_VRES forKey:NTVerticalResolution];
  75.     [sampleDescription setObject:
  76.                 [componentDict objectForKey:NTLocalizedComponentName]
  77.             forKey: NTCodecName];
  78.     [sampleDescription setInteger:NULLVIDEO_BPP forKey:NTBitsPerPixel];
  79.     [sampleDescription setObject:NULLVIDEO_COLORSPACE forKey:NTColorSpace];
  80. }
  81.  
  82. - (BOOL) finalizeConfiguration
  83. {
  84.     [self setupSampleDescription];
  85.  
  86.     return YES;
  87.  
  88. - (void)dealloc
  89. {
  90.     [sampleDescription release];
  91.     [super dealloc];
  92. }
  93.  
  94.  static int
  95. null_encode( const unsigned int *sptr, unsigned int *dptr,
  96.         int width, int height, int srb )
  97. {
  98.     int x, y;
  99.     unsigned int *start = dptr;
  100.     // Simple-minded pixel copier that honors rowbytes
  101.     for (y = 0; y < height; ++y)
  102.     {
  103.         for (x = 0; x < width; ++x)
  104.         {
  105.         *dptr++ = *sptr++;
  106.         }
  107.         sptr += ((srb / sizeof *sptr) - width);
  108.     }
  109.     return (dptr - start) * (sizeof *dptr);
  110. }
  111.  
  112. - (void)processSamplesFrom: (NTSampleBuffer *)src
  113.     to: (NTMutableSampleBuffer *) dst
  114. {
  115.     const unsigned int *sptr = [src bytes];
  116.     unsigned int *dptr = [dst mutableBytes];
  117.     int size;
  118.     int srb = [[src sampleDescription] integerForKey:NTBytesPerRow];
  119.  
  120.     size = null_encode(sptr, dptr, width, height, srb);
  121.     [dst setSampleSize: size]; 
  122. }
  123.  
  124. - (NTMutableSampleBuffer *) outputBufferForInput: (NTSampleBuffer *) buf
  125. {
  126.     return [[[NTMutableSampleBuffer allocWithZone:zone]
  127.          initSampleWithCapacity: (width * height + 5) * sizeof(int)
  128.          sampleSize        : (width * height) * sizeof(int)
  129.          startingTime     : [buf startingTime]
  130.          sampleDuration    : [buf sampleDuration]
  131.          sampleCount    : 1
  132.          sampleDescription    : sampleDescription
  133.          sampleFlags    : NTSyncSample
  134.          trackID        : [buf trackID]
  135.          sequenceNumber    : [buf sequenceNumber] ] autorelease];
  136. }
  137.  
  138. @end
  139.  
  140.  
  141.  
  142.  
  143.