Exemple #1
0
static int y4m_parse_frame_tags(char *s, y4m_frame_info_t *i)
{
  char *token, *value;
  char tag;
  int err;

  /* parse fields */
  for (token = strtok(s, Y4M_DELIM); 
       token != NULL; 
       token = strtok(NULL, Y4M_DELIM)) {
    if (token[0] == '\0') continue;   /* skip empty strings */
    tag = token[0];
    value = token + 1;
    switch (tag) {
    case 'X':  /* 'X' meta-tag */
      if ((err = y4m_xtag_add(&(i->x_tags), token)) != Y4M_OK) return err;
      break;
    default:
      /* possible error on unknown options */
      if (_y4mparam_allow_unknown_tags) {
	/* unknown tags ok:  store in xtag list and warn... */
	if ((err = y4m_xtag_add(&(i->x_tags), token)) != Y4M_OK) return err;
	mp_msg(MSGT_DEMUX, MSGL_WARN, "Unknown frame tag encountered:  '%s'\n", token);
      } else {
	/* unknown tags are *not* ok */
	return Y4M_ERR_BADTAG;
      }
      break;
    }
  }
  /* ta da!  done. */
  return Y4M_OK;
}
Exemple #2
0
static int y4m_parse_frame_tags(char *s, const y4m_stream_info_t *si,
				y4m_frame_info_t *fi)
{
  char *token, *value;
  char tag;
  int err;

  /* parse fields */
  for (token = strtok(s, Y4M_DELIM); 
       token != NULL; 
       token = strtok(NULL, Y4M_DELIM)) {
    if (token[0] == '\0') continue;   /* skip empty strings */
    tag = token[0];
    value = token + 1;
    switch (tag) {
    case 'I':
      /* frame 'I' tag requires feature level >= 1 */
      if (_y4mparam_feature_level < 1) return Y4M_ERR_FEATURE;
      if (si->interlace != Y4M_ILACE_MIXED) return Y4M_ERR_BADTAG;
      switch (value[0]) {
      case 't':  fi->presentation = Y4M_PRESENT_TOP_FIRST;        break;
      case 'T':  fi->presentation = Y4M_PRESENT_TOP_FIRST_RPT;    break;
      case 'b':  fi->presentation = Y4M_PRESENT_BOTTOM_FIRST;     break;
      case 'B':  fi->presentation = Y4M_PRESENT_BOTTOM_FIRST_RPT; break;
      case '1':  fi->presentation = Y4M_PRESENT_PROG_SINGLE;      break;
      case '2':  fi->presentation = Y4M_PRESENT_PROG_DOUBLE;      break;
      case '3':  fi->presentation = Y4M_PRESENT_PROG_TRIPLE;      break;
      default: 
	return Y4M_ERR_BADTAG;
      }
      switch (value[1]) {
      case 'p':  fi->temporal = Y4M_SAMPLING_PROGRESSIVE; break;
      case 'i':  fi->temporal = Y4M_SAMPLING_INTERLACED;  break;
      default: 
	return Y4M_ERR_BADTAG;
      }
      switch (value[2]) {
      case 'p':  fi->spatial = Y4M_SAMPLING_PROGRESSIVE; break;
      case 'i':  fi->spatial = Y4M_SAMPLING_INTERLACED;  break;
      case '?':  fi->spatial = Y4M_UNKNOWN;              break;
      default: 
	return Y4M_ERR_BADTAG;
      }
      break;
    case 'X':  /* 'X' meta-tag */
      if ((err = y4m_xtag_add(&(fi->x_tags), token)) != Y4M_OK) return err;
      break;
    default:
      /* possible error on unknown options */
      if (_y4mparam_allow_unknown_tags) {
	/* unknown tags ok:  store in xtag list and warn... */
	if ((err = y4m_xtag_add(&(fi->x_tags), token)) != Y4M_OK) return err;
	mjpeg_warn("Unknown frame tag encountered:  '%s'", token);
      } else {
	/* unknown tags are *not* ok */
	return Y4M_ERR_BADTAG;
      }
      break;
    }
  }
  /* error-checking and/or non-mixed defaults */
  switch (si->interlace) {
  case Y4M_ILACE_MIXED:
    /* T and P are required if stream "Im" */
    if ((fi->presentation == Y4M_UNKNOWN) || (fi->temporal == Y4M_UNKNOWN))
      return Y4M_ERR_HEADER;
    /* and S is required if stream is also 4:2:0 */
    if ( ((si->chroma == Y4M_CHROMA_420JPEG) ||
          (si->chroma == Y4M_CHROMA_420MPEG2) ||
          (si->chroma == Y4M_CHROMA_420PALDV)) &&
         (fi->spatial == Y4M_UNKNOWN) )
      return Y4M_ERR_HEADER;
    break;
  case Y4M_ILACE_NONE:
    /* stream "Ip" --> equivalent to frame "I1pp" */
    fi->spatial = Y4M_SAMPLING_PROGRESSIVE;
    fi->temporal = Y4M_SAMPLING_PROGRESSIVE;
    fi->presentation = Y4M_PRESENT_PROG_SINGLE;
    break;
  case Y4M_ILACE_TOP_FIRST:
    /* stream "It" --> equivalent to frame "Itii" */
    fi->spatial = Y4M_SAMPLING_INTERLACED;
    fi->temporal = Y4M_SAMPLING_INTERLACED;
    fi->presentation = Y4M_PRESENT_TOP_FIRST;
    break;
  case Y4M_ILACE_BOTTOM_FIRST:
    /* stream "Ib" --> equivalent to frame "Ibii" */
    fi->spatial = Y4M_SAMPLING_INTERLACED;
    fi->temporal = Y4M_SAMPLING_INTERLACED;
    fi->presentation = Y4M_PRESENT_BOTTOM_FIRST;
    break;
  default:
    /* stream unknown:  then, whatever */
    break;
  }
  /* ta da!  done. */
  return Y4M_OK;
}
Exemple #3
0
int y4m_parse_stream_tags(char *s, y4m_stream_info_t *i)
{
  char *token, *value;
  char tag;
  int err;

  /* parse fields */
  for (token = strtok(s, Y4M_DELIM); 
       token != NULL; 
       token = strtok(NULL, Y4M_DELIM)) {
    if (token[0] == '\0') continue;   /* skip empty strings */
    tag = token[0];
    value = token + 1;
    switch (tag) {
    case 'W':  /* width */
      i->width = atoi(value);
      if (i->width <= 0) return Y4M_ERR_RANGE;
      break;
    case 'H':  /* height */
      i->height = atoi(value); 
      if (i->height <= 0) return Y4M_ERR_RANGE;
      break;
    case 'F':  /* frame rate (fps) */
      if ((err = y4m_parse_ratio(&(i->framerate), value)) != Y4M_OK)
	return err;
      if (i->framerate.n < 0) return Y4M_ERR_RANGE;
      break;
    case 'I':  /* interlacing */
      switch (value[0]) {
      case 'p':  i->interlace = Y4M_ILACE_NONE; break;
      case 't':  i->interlace = Y4M_ILACE_TOP_FIRST; break;
      case 'b':  i->interlace = Y4M_ILACE_BOTTOM_FIRST; break;
      case '?':
      default:
	i->interlace = Y4M_UNKNOWN; break;
      }
      break;
    case 'A':  /* sample (pixel) aspect ratio */
      if ((err = y4m_parse_ratio(&(i->sampleaspect), value)) != Y4M_OK)
	return err;
      if (i->sampleaspect.n < 0) return Y4M_ERR_RANGE;
      break;
    case 'X':  /* 'X' meta-tag */
      if ((err = y4m_xtag_add(&(i->x_tags), token)) != Y4M_OK) return err;
      break;
    default:
      /* possible error on unknown options */
      if (_y4mparam_allow_unknown_tags) {
	/* unknown tags ok:  store in xtag list and warn... */
	if ((err = y4m_xtag_add(&(i->x_tags), token)) != Y4M_OK) return err;
	mp_msg(MSGT_DEMUX, MSGL_WARN, "Unknown stream tag encountered:  '%s'\n", token);
      } else {
	/* unknown tags are *not* ok */
	return Y4M_ERR_BADTAG;
      }
      break;
    }
  }
  /* Error checking... width and height must be known since we can't
   * parse without them
   */
  if( i->width == Y4M_UNKNOWN || i->height == Y4M_UNKNOWN )
	  return Y4M_ERR_HEADER;
  /* ta da!  done. */
  return Y4M_OK;
}
Exemple #4
0
int y4m_parse_stream_tags(char *s, y4m_stream_info_t *i)
{
  char *token, *value;
  char tag;
  int err;

  /* parse fields */
  for (token = strtok(s, Y4M_DELIM); 
       token != NULL; 
       token = strtok(NULL, Y4M_DELIM)) {
    if (token[0] == '\0') continue;   /* skip empty strings */
    tag = token[0];
    value = token + 1;
    switch (tag) {
    case 'W':  /* width */
      i->width = atoi(value);
      if (i->width <= 0) return Y4M_ERR_RANGE;
      break;
    case 'H':  /* height */
      i->height = atoi(value); 
      if (i->height <= 0) return Y4M_ERR_RANGE;
      break;
    case 'F':  /* frame rate (fps) */
      if ((err = y4m_parse_ratio(&(i->framerate), value)) != Y4M_OK)
	return err;
      if (i->framerate.n < 0) return Y4M_ERR_RANGE;
      break;
    case 'I':  /* interlacing */
      switch (value[0]) {
      case 'p':  i->interlace = Y4M_ILACE_NONE; break;
      case 't':  i->interlace = Y4M_ILACE_TOP_FIRST; break;
      case 'b':  i->interlace = Y4M_ILACE_BOTTOM_FIRST; break;
      case 'm':  i->interlace = Y4M_ILACE_MIXED; break;
      case '?':
      default:
	i->interlace = Y4M_UNKNOWN; break;
      }
      break;
    case 'A':  /* sample (pixel) aspect ratio */
      if ((err = y4m_parse_ratio(&(i->sampleaspect), value)) != Y4M_OK)
	return err;
      if (i->sampleaspect.n < 0) return Y4M_ERR_RANGE;
      break;
    case 'C':
      i->chroma = y4m_chroma_parse_keyword(value);
      if (i->chroma == Y4M_UNKNOWN)
	return Y4M_ERR_HEADER;
      break;
    case 'X':  /* 'X' meta-tag */
      if ((err = y4m_xtag_add(&(i->x_tags), token)) != Y4M_OK) return err;
      break;
    default:
      /* possible error on unknown options */
      if (_y4mparam_allow_unknown_tags) {
	/* unknown tags ok:  store in xtag list and warn... */
	if ((err = y4m_xtag_add(&(i->x_tags), token)) != Y4M_OK) return err;
	mjpeg_warn("Unknown stream tag encountered:  '%s'", token);
      } else {
	/* unknown tags are *not* ok */
	return Y4M_ERR_BADTAG;
      }
      break;
    }
  }

  /* Without 'C' tag or any other chroma spec, default to 420jpeg */
  if (i->chroma == Y4M_UNKNOWN) 
    i->chroma = Y4M_CHROMA_420JPEG;

  /* Error checking... */
  /*      - Width and Height are required. */
  if ((i->width == Y4M_UNKNOWN) || (i->height == Y4M_UNKNOWN))
    return Y4M_ERR_HEADER;
  /*      - Non-420 chroma and mixed interlace require level >= 1 */
  if (_y4mparam_feature_level < 1) {
    if ((i->chroma != Y4M_CHROMA_420JPEG) &&
	(i->chroma != Y4M_CHROMA_420MPEG2) &&
	(i->chroma != Y4M_CHROMA_420PALDV))
      return Y4M_ERR_FEATURE;
    if (i->interlace == Y4M_ILACE_MIXED)
      return Y4M_ERR_FEATURE;
  }

  /* ta da!  done. */
  return Y4M_OK;
}