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; }
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; }
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; }
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; }