コード例 #1
0
ファイル: mxfup.c プロジェクト: prajnashi/gst-plugins-bad
static GstCaps *
mxf_up_create_caps (MXFMetadataTimelineTrack * track, GstTagList ** tags,
    MXFEssenceElementHandleFunc * handler, gpointer * mapping_data)
{
  MXFMetadataGenericPictureEssenceDescriptor *p = NULL;
  MXFMetadataCDCIPictureEssenceDescriptor *c = NULL;
  MXFMetadataRGBAPictureEssenceDescriptor *r = NULL;
  guint i;
  GstCaps *caps = NULL;

  g_return_val_if_fail (track != NULL, NULL);

  if (track->parent.descriptor == NULL) {
    GST_ERROR ("No descriptor found for this track");
    return NULL;
  }

  for (i = 0; i < track->parent.n_descriptor; i++) {
    if (!track->parent.descriptor[i])
      continue;

    if (MXF_IS_METADATA_RGBA_PICTURE_ESSENCE_DESCRIPTOR (track->
            parent.descriptor[i])) {
      p = (MXFMetadataGenericPictureEssenceDescriptor *) track->
          parent.descriptor[i];
      r = (MXFMetadataRGBAPictureEssenceDescriptor *) track->
          parent.descriptor[i];
      break;
    } else if (MXF_IS_METADATA_CDCI_PICTURE_ESSENCE_DESCRIPTOR (track->parent.
            descriptor[i])) {
      p = (MXFMetadataGenericPictureEssenceDescriptor *) track->
          parent.descriptor[i];
      c = (MXFMetadataCDCIPictureEssenceDescriptor *) track->
          parent.descriptor[i];
    }
  }

  if (!p) {
    GST_ERROR ("No picture essence descriptor found for this track");
    return NULL;
  }

  *handler = mxf_up_handle_essence_element;

  if (r) {
    caps = mxf_up_rgba_create_caps (track, r, tags, handler, mapping_data);
  } else {
    GST_ERROR ("CDCI uncompressed picture essence not supported yet");
    return NULL;
  }

  if (caps) {
    mxf_metadata_generic_picture_essence_descriptor_set_caps (p, caps);
  }

  return caps;
}
コード例 #2
0
ファイル: mxfvc3.c プロジェクト: Distrotech/gst-plugins-bad
static GstCaps *
mxf_vc3_create_caps (MXFMetadataTimelineTrack * track, GstTagList ** tags,
    MXFEssenceElementHandleFunc * handler, gpointer * mapping_data)
{
  MXFMetadataFileDescriptor *f = NULL;
  MXFMetadataGenericPictureEssenceDescriptor *p = NULL;
  guint i;
  GstCaps *caps = NULL;

  g_return_val_if_fail (track != NULL, NULL);

  if (track->parent.descriptor == NULL) {
    GST_ERROR ("No descriptor found for this track");
    return NULL;
  }

  for (i = 0; i < track->parent.n_descriptor; i++) {
    if (!track->parent.descriptor[i])
      continue;

    if (MXF_IS_METADATA_GENERIC_PICTURE_ESSENCE_DESCRIPTOR (track->
            parent.descriptor[i])) {
      p = (MXFMetadataGenericPictureEssenceDescriptor *) track->parent.
          descriptor[i];
      f = track->parent.descriptor[i];
      break;
    } else if (MXF_IS_METADATA_FILE_DESCRIPTOR (track->parent.descriptor[i]) &&
        !MXF_IS_METADATA_MULTIPLE_DESCRIPTOR (track->parent.descriptor[i])) {
      f = track->parent.descriptor[i];
    }
  }

  if (!f) {
    GST_ERROR ("No descriptor found for this track");
    return NULL;
  }

  *handler = mxf_vc3_handle_essence_element;

  caps = gst_caps_new_empty_simple ("video/x-dnxhd");
  if (p) {
    mxf_metadata_generic_picture_essence_descriptor_set_caps (p, caps);
  } else {
    GST_WARNING ("Only a generic file descriptor found");
  }

  if (!*tags)
    *tags = gst_tag_list_new_empty ();
  gst_tag_list_add (*tags, GST_TAG_MERGE_APPEND, GST_TAG_VIDEO_CODEC,
      "VC-3 Video", NULL);

  return caps;
}
コード例 #3
0
ファイル: mxfup.c プロジェクト: pli3/gst-plugins-bad
static GstCaps *
mxf_up_rgba_create_caps (MXFMetadataTimelineTrack * track,
    MXFMetadataRGBAPictureEssenceDescriptor * d, GstTagList ** tags,
    MXFEssenceElementHandleFunc * handler, gpointer * mapping_data)
{
  GstCaps *caps = NULL;
  guint i;
  guint32 fourcc;
  guint bpp;

  if (!d->pixel_layout) {
    GST_ERROR ("No pixel layout");
    return NULL;
  }

  for (i = 0; i < G_N_ELEMENTS (_rgba_mapping_table); i++) {
    if (d->n_pixel_layout != _rgba_mapping_table[i].n_pixel_layout)
      continue;

    if (memcmp (d->pixel_layout, &_rgba_mapping_table[i].pixel_layout,
            _rgba_mapping_table[i].n_pixel_layout * 2) == 0) {
      caps = gst_caps_from_string (_rgba_mapping_table[i].caps);
      fourcc = _rgba_mapping_table[i].fourcc;
      bpp = _rgba_mapping_table[i].n_pixel_layout;
      break;
    }
  }

  if (caps) {
    MXFUPMappingData *data = g_new0 (MXFUPMappingData, 1);

    mxf_metadata_generic_picture_essence_descriptor_set_caps (&d->parent, caps);

    data->width = d->parent.stored_width;
    data->height = d->parent.stored_height;
    data->fourcc = fourcc;
    data->bpp = bpp;
    data->image_start_offset =
        ((MXFMetadataGenericPictureEssenceDescriptor *) d)->image_start_offset;
    data->image_end_offset =
        ((MXFMetadataGenericPictureEssenceDescriptor *) d)->image_end_offset;

    *mapping_data = data;
  } else {
    GST_WARNING ("Unsupported pixel layout");
  }

  return caps;
}
コード例 #4
0
ファイル: mxfup.c プロジェクト: pli3/gst-plugins-bad
static GstCaps *
mxf_up_cdci_create_caps (MXFMetadataTimelineTrack * track,
    MXFMetadataCDCIPictureEssenceDescriptor * d, GstTagList ** tags,
    MXFEssenceElementHandleFunc * handler, gpointer * mapping_data)
{
  GstCaps *caps = NULL;
  guint i;
  guint32 fourcc;
  guint bpp;

  for (i = 0; i < G_N_ELEMENTS (_cdci_mapping_table); i++) {
    if (_cdci_mapping_table[i].horizontal_subsampling ==
        d->horizontal_subsampling
        && _cdci_mapping_table[i].vertical_subsampling ==
        d->vertical_subsampling
        && _cdci_mapping_table[i].reversed_byte_order ==
        d->reversed_byte_order) {
      caps = gst_caps_from_string (_cdci_mapping_table[i].caps);
      fourcc = _cdci_mapping_table[i].fourcc;
      bpp = _cdci_mapping_table[i].bpp;
      break;
    }
  }

  if (caps) {
    MXFUPMappingData *data = g_new0 (MXFUPMappingData, 1);

    mxf_metadata_generic_picture_essence_descriptor_set_caps (&d->parent, caps);

    data->width = d->parent.stored_width;
    data->height = d->parent.stored_height;
    data->fourcc = fourcc;
    data->bpp = bpp;
    data->image_start_offset =
        ((MXFMetadataGenericPictureEssenceDescriptor *) d)->image_start_offset;
    data->image_end_offset =
        ((MXFMetadataGenericPictureEssenceDescriptor *) d)->image_end_offset;

    *mapping_data = data;
  } else {
    GST_WARNING ("Unsupported CDCI format");
  }

  return caps;
}
コード例 #5
0
ファイル: mxfdv-dif.c プロジェクト: collects/gst-plugins-bad
static GstCaps *
mxf_dv_dif_create_caps (MXFMetadataTimelineTrack * track, GstTagList ** tags,
    MXFEssenceElementHandleFunc * handler, gpointer * mapping_data)
{
  GstCaps *caps = NULL;
  guint i;
  MXFMetadataGenericPictureEssenceDescriptor *d = NULL;

  g_return_val_if_fail (track != NULL, NULL);

  if (track->parent.descriptor == NULL) {
    GST_ERROR ("No descriptor found for this track");
    return NULL;
  }

  for (i = 0; i < track->parent.n_descriptor; i++) {
    if (MXF_IS_METADATA_GENERIC_PICTURE_ESSENCE_DESCRIPTOR (track->
            parent.descriptor[i])) {
      d = MXF_METADATA_GENERIC_PICTURE_ESSENCE_DESCRIPTOR (track->
          parent.descriptor[i]);
      break;
    }
  }

  *handler = mxf_dv_dif_handle_essence_element;
  /* SMPTE 383M 8 */

  /* TODO: might be video or audio only, use values of the generic sound/picture
   * descriptor in the caps in that case
   */
  GST_DEBUG ("Found DV-DIF stream");
  caps =
      gst_caps_new_simple ("video/x-dv", "systemstream", G_TYPE_BOOLEAN, TRUE,
      NULL);

  if (d)
    mxf_metadata_generic_picture_essence_descriptor_set_caps (d, caps);

  if (!*tags)
    *tags = gst_tag_list_new_empty ();

  gst_tag_list_add (*tags, GST_TAG_MERGE_APPEND, GST_TAG_CODEC, "DV-DIF", NULL);

  return caps;
}
コード例 #6
0
ファイル: mxfjpeg2000.c プロジェクト: ChinnaSuhas/ossbuild
static GstCaps *
mxf_jpeg2000_create_caps (MXFMetadataTimelineTrack * track, GstTagList ** tags,
    MXFEssenceElementHandleFunc * handler, gpointer * mapping_data)
{
  MXFMetadataFileDescriptor *f = NULL;
  MXFMetadataGenericPictureEssenceDescriptor *p = NULL;
  guint i;
  GstCaps *caps = NULL;
  guint32 fourcc;

  g_return_val_if_fail (track != NULL, NULL);

  if (track->parent.descriptor == NULL) {
    GST_ERROR ("No descriptor found for this track");
    return NULL;
  }

  for (i = 0; i < track->parent.n_descriptor; i++) {
    if (!track->parent.descriptor[i])
      continue;

    if (MXF_IS_METADATA_GENERIC_PICTURE_ESSENCE_DESCRIPTOR (track->parent.
            descriptor[i])) {
      p = (MXFMetadataGenericPictureEssenceDescriptor *) track->
          parent.descriptor[i];
      f = track->parent.descriptor[i];
      break;
    } else if (MXF_IS_METADATA_FILE_DESCRIPTOR (track->parent.descriptor[i]) &&
        !MXF_IS_METADATA_MULTIPLE_DESCRIPTOR (track->parent.descriptor[i])) {
      f = track->parent.descriptor[i];
    }
  }

  if (!f) {
    GST_ERROR ("No descriptor found for this track");
    return NULL;
  }

  fourcc = GST_MAKE_FOURCC ('s', 'R', 'G', 'B');
  if (p && MXF_IS_METADATA_CDCI_PICTURE_ESSENCE_DESCRIPTOR (p)) {
    fourcc = GST_MAKE_FOURCC ('s', 'Y', 'U', 'V');
  } else if (p && MXF_IS_METADATA_RGBA_PICTURE_ESSENCE_DESCRIPTOR (p)) {
    MXFMetadataRGBAPictureEssenceDescriptor *r =
        (MXFMetadataRGBAPictureEssenceDescriptor *) p;
    gboolean rgb = TRUE;
    gboolean xyz = TRUE;
    gboolean yuv = TRUE;
    guint i;

    if (r->pixel_layout) {
      for (i = 0; i < r->n_pixel_layout; i++) {
        guint8 c = r->pixel_layout[2 * i];

        switch (c) {
          case 'R':
          case 'r':
          case 'G':
          case 'g':
          case 'B':
          case 'b':
            xyz = yuv = FALSE;
            break;
          case 'Y':
          case 'y':
            rgb = FALSE;
            break;
          case 'U':
          case 'u':
          case 'V':
          case 'v':
            xyz = rgb = FALSE;
            break;
          case 'X':
          case 'x':
          case 'Z':
          case 'z':
            rgb = yuv = FALSE;
            break;
          default:
            break;
        }
      }
      if (rgb) {
        fourcc = GST_MAKE_FOURCC ('s', 'R', 'G', 'B');
      } else if (yuv) {
        fourcc = GST_MAKE_FOURCC ('s', 'Y', 'U', 'V');
      } else if (xyz) {
        GST_ERROR ("JPEG2000 with XYZ colorspace not supported yet");
        return NULL;
      }
    }
  }

  *handler = mxf_jpeg2000_handle_essence_element;

  /* TODO: What about other field values? */
  caps =
      gst_caps_new_simple ("image/x-jpc", "fields", G_TYPE_INT, 1, "fourcc",
      GST_TYPE_FOURCC, fourcc, NULL);
  if (p) {
    mxf_metadata_generic_picture_essence_descriptor_set_caps (p, caps);
  } else {
    GST_WARNING ("Only a generic file descriptor found");
  }

  if (!*tags)
    *tags = gst_tag_list_new ();
  gst_tag_list_add (*tags, GST_TAG_MERGE_APPEND, GST_TAG_VIDEO_CODEC,
      "JPEG 2000", NULL);

  return caps;
}