Технические вопросы и ответы QA1547

Поле получения Programatically и информация о кадрах

Q: Как я могу программно узнать, чередуются ли видео носители в фильме в формате QuickTime или прогрессивное сканирование?

A: Как я могу программно узнать, чередуются ли видео носители в фильме в формате QuickTime или прогрессивное сканирование?

Поле/Информация о кадрах для Носители сохранены в Описании Изображения и могут быть возвращены путем вызова ICMImageDescriptionGetProperty использование kICMImageDescriptionPropertyID_FieldInfo свойство ID.

Выяснение kICMImageDescriptionPropertyID_FieldInfo свойство возвратит информацию (при наличии) в a FieldInfoImageDescriptionExtension2 структура (см. ниже). fields переменная этой структуры будет или установлена в kQTFieldsProgressiveScan если содержание является прогрессивным, или kQTFieldsInterlaced если это чередуется.

/* Field/Frame Info */
struct FieldInfoImageDescriptionExtension2 {
  UInt8               fields;
  UInt8               detail;
};

/* Field Info Values */
enum {
  kQTFieldsProgressiveScan  = 1,
  kQTFieldsInterlaced       = 2
};

/* Frame Detail Values */
enum {
  kQTFieldDetailUnknown                 = 0,
  kQTFieldDetailTemporalTopFirst        = 1,
  kQTFieldDetailTemporalBottomFirst     = 6,
  kQTFieldDetailSpatialFirstLineEarly   = 9,
  kQTFieldDetailSpatialFirstLineLate    = 14
};

Перечисление 1 демонстрирует использование ICMImageDescriptionGetProperty получить информацию Поля/Кадра.

Перечисление 1  функция IsInterlaced.

Boolean IsInterlaced(Track inVideoTrack)
{
    Media aMedia = 0;
    Boolean isInterlaced = NO; // assume progressive
    FieldInfoImageDescriptionExtension2 *fieldInfo = NULL;
    ImageDescriptionHandle desc = NULL;

    if (0 == inVideoTrack) goto bail;

    // get the tracks media
    aMedia = GetTrackMedia(inVideoTrack);
    if (0 == aMedia) goto bail;

    // grab the image description
    desc = (ImageDescriptionHandle)NewHandle(0);
    if (NULL == desc) goto bail;
    GetMediaSampleDescription(aMedia, 1, (SampleDescriptionHandle)desc);

    // get the size of the returned property
    ByteCount propertyValueSize = 0;
    ComponentValueType propertyType = 0;
    UInt32 propertyFlags = 0;

    OSStatus status = ICMImageDescriptionGetPropertyInfo(desc,
                                                         kQTPropertyClass_ImageDescription,
                                                         kICMImageDescriptionPropertyID_FieldInfo,
                                                         &propertyType,
                                                         &propertyValueSize,
                                                         &propertyFlags);
   if (noErr != status) goto bail;

    // get the FieldInfo property - for more information see ImageCodec.h
    fieldInfo = (FieldInfoImageDescriptionExtension2 *)calloc(1, propertyValueSize);

    status = ICMImageDescriptionGetProperty(desc,
                                            kQTPropertyClass_ImageDescription,
                                            kICMImageDescriptionPropertyID_FieldInfo,
                                            propertyValueSize,
                                            fieldInfo,
                                            NULL);
    // check the value
    if (noErr == status) {
        isInterlaced = (fieldInfo->fields == kQTFieldsInterlaced);
    }

bail:
    if (NULL != desc) DisposeHandle((Handle)desc);
    if (NULL != fieldInfo) free(fieldInfo);

    return isInterlaced;
}

Ссылки



История версии документа


ДатаПримечания
13.09.2007

Новый документ, обсуждающий использование kICMImageDescriptionPropertyID_FieldInfo свойства для получения Поля/Информации о кадрах.