⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 yuv4mpeg.c

📁 自己移植的linux下的流媒体播放器原代码,支持mms协议,支持ftp和http协议.
💻 C
📖 第 1 页 / 共 2 页
字号:
/* *  yuv4mpeg.c:  Functions for reading and writing "new" YUV4MPEG streams * *  Copyright (C) 2001 Matthew J. Marjanovic <maddog@mir.com> * *  This file is ripped from the lavtools package (mjpeg.sourceforge.net) *  Ported to mplayer by Rik Snel <rsnel@cube.dyndns.org> * *  This program is free software; you can redistribute it and/or *  modify it under the terms of the GNU General Public License *  as published by the Free Software Foundation; either version 2 *  of the License, or (at your option) any later version. * *  This program is distributed in the hope that it will be useful, *  but WITHOUT ANY WARRANTY; without even the implied warranty of *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the *  GNU General Public License for more details. * *  You should have received a copy of the GNU General Public License *  along with this program; if not, write to the Free Software *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA. * */#include "config.h"#include <unistd.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include "yuv4mpeg.h"#include "yuv4mpeg_intern.h"#include "mp_msg.h"static int _y4mparam_allow_unknown_tags = 1;  /* default is forgiveness */static void *(*_y4m_alloc)(size_t bytes) = malloc;static void (*_y4m_free)(void *ptr) = free;int y4m_allow_unknown_tags(int yn) {	int old = _y4mparam_allow_unknown_tags;  	if (yn >= 0) _y4mparam_allow_unknown_tags = (yn) ? 1 : 0;  	return old;}/************************************************************************* * * Convenience functions for fd read/write * *   - guaranteed to transfer entire payload (or fail) *   - returns: *               0 on complete success *               +(# of remaining bytes) on eof (for y4m_read) *               -(# of rem. bytes) on error (and ERRNO should be set) *      *************************************************************************/ssize_t y4m_read(stream_t *s, char *buf, size_t len){   ssize_t n;   while (len > 0) {     n = stream_read(s, buf, len);     if (n <= 0) {       /* return amount left to read */       if (n == 0)	 return len;  /* n == 0 --> eof */       else	 return -len; /* n < 0 --> error */     }     buf += n;     len -= n;   }   return 0;}#if 0 /* not needed */ssize_t y4m_write(int fd, char *buf, size_t len){   ssize_t n;   while (len > 0) {     n = write(fd, buf, len);     if (n < 0) return -len;  /* return amount left to write */     buf += n;     len -= n;   }   return 0;}#endif/************************************************************************* * * "Extra tags" handling * *************************************************************************/static char *y4m_new_xtag(){  return _y4m_alloc(Y4M_MAX_XTAG_SIZE * sizeof(char));}void y4m_init_xtag_list(y4m_xtag_list_t *xtags){  int i;  xtags->count = 0;  for (i = 0; i < Y4M_MAX_XTAGS; i++) {    xtags->tags[i] = NULL;  }}void y4m_fini_xtag_list(y4m_xtag_list_t *xtags){  int i;  for (i = 0; i < Y4M_MAX_XTAGS; i++) {    if (xtags->tags[i] != NULL) {      _y4m_free(xtags->tags[i]);      xtags->tags[i] = NULL;    }  }  xtags->count = 0;}void y4m_copy_xtag_list(y4m_xtag_list_t *dest, const y4m_xtag_list_t *src){  int i;  for (i = 0; i < src->count; i++) {    if (dest->tags[i] == NULL)       dest->tags[i] = y4m_new_xtag();    strncpy(dest->tags[i], src->tags[i], Y4M_MAX_XTAG_SIZE);  }  dest->count = src->count;}static int y4m_snprint_xtags(char *s, int maxn, y4m_xtag_list_t *xtags){  int i, room;    for (i = 0, room = maxn - 1; i < xtags->count; i++) {    int n = snprintf(s, room + 1, " %s", xtags->tags[i]);    if ((n < 0) || (n > room)) return Y4M_ERR_HEADER;    s += n;    room -= n;  }  s[0] = '\n';  /* finish off header with newline */  s[1] = '\0';  /* ...and end-of-string           */  return Y4M_OK;}int y4m_xtag_count(const y4m_xtag_list_t *xtags){  return xtags->count;}const char *y4m_xtag_get(const y4m_xtag_list_t *xtags, int n){  if (n >= xtags->count)    return NULL;  else    return xtags->tags[n];}int y4m_xtag_add(y4m_xtag_list_t *xtags, const char *tag){  if (xtags->count >= Y4M_MAX_XTAGS) return Y4M_ERR_XXTAGS;  if (xtags->tags[xtags->count] == NULL) {    xtags->tags[xtags->count] = y4m_new_xtag();  }  strncpy(xtags->tags[xtags->count], tag, Y4M_MAX_XTAG_SIZE);  (xtags->count)++;  return Y4M_OK;}int y4m_xtag_remove(y4m_xtag_list_t *xtags, int n){  int i;  char *q;  if ((n < 0) || (n >= xtags->count)) return Y4M_ERR_RANGE;  q = xtags->tags[n];  for (i = n; i < (xtags->count - 1); i++)    xtags->tags[i] = xtags->tags[i+1];  xtags->tags[i] = q;  (xtags->count)--;  return Y4M_OK;}int y4m_xtag_clearlist(y4m_xtag_list_t *xtags){  xtags->count = 0;  return Y4M_OK;}int y4m_xtag_addlist(y4m_xtag_list_t *dest, const y4m_xtag_list_t *src){  int i, j;  if ((dest->count + src->count) > Y4M_MAX_XTAGS) return Y4M_ERR_XXTAGS;  for (i = dest->count, j = 0;       j < src->count;       i++, j++) {    if (dest->tags[i] == NULL)       dest->tags[i] = y4m_new_xtag();    strncpy(dest->tags[i], src->tags[i], Y4M_MAX_XTAG_SIZE);  }  dest->count += src->count;  return Y4M_OK;}  /************************************************************************* * * Creators/destructors for y4m_*_info_t structures * *************************************************************************/void y4m_init_stream_info(y4m_stream_info_t *info){  if (info == NULL) return;  /* initialize info */  info->width = Y4M_UNKNOWN;  info->height = Y4M_UNKNOWN;  info->interlace = Y4M_UNKNOWN;  info->framerate = y4m_fps_UNKNOWN;  info->sampleaspect = y4m_sar_UNKNOWN;  y4m_init_xtag_list(&(info->x_tags));}void y4m_copy_stream_info(y4m_stream_info_t *dest, y4m_stream_info_t *src){  if ((dest == NULL) || (src == NULL)) return;  /* copy info */  dest->width = src->width;  dest->height = src->height;  dest->interlace = src->interlace;  dest->framerate = src->framerate;  dest->sampleaspect = src->sampleaspect;  y4m_copy_xtag_list(&(dest->x_tags), &(src->x_tags));}void y4m_fini_stream_info(y4m_stream_info_t *info){  if (info == NULL) return;  y4m_fini_xtag_list(&(info->x_tags));}void y4m_si_set_width(y4m_stream_info_t *si, int width){  si->width = width;  si->framelength = (si->height * si->width) * 3 / 2;}int y4m_si_get_width(y4m_stream_info_t *si){ return si->width; }void y4m_si_set_height(y4m_stream_info_t *si, int height){  si->height = height;   si->framelength = (si->height * si->width) * 3 / 2;}int y4m_si_get_height(y4m_stream_info_t *si){ return si->height; }void y4m_si_set_interlace(y4m_stream_info_t *si, int interlace){ si->interlace = interlace; }int y4m_si_get_interlace(y4m_stream_info_t *si){ return si->interlace; }void y4m_si_set_framerate(y4m_stream_info_t *si, y4m_ratio_t framerate){ si->framerate = framerate; }y4m_ratio_t y4m_si_get_framerate(y4m_stream_info_t *si){ return si->framerate; }void y4m_si_set_sampleaspect(y4m_stream_info_t *si, y4m_ratio_t sar){ si->sampleaspect = sar; }y4m_ratio_t y4m_si_get_sampleaspect(y4m_stream_info_t *si){ return si->sampleaspect; }int y4m_si_get_framelength(y4m_stream_info_t *si){ return si->framelength; }y4m_xtag_list_t *y4m_si_xtags(y4m_stream_info_t *si){ return &(si->x_tags); }void y4m_init_frame_info(y4m_frame_info_t *info){  if (info == NULL) return;  /* initialize info */  y4m_init_xtag_list(&(info->x_tags));}void y4m_copy_frame_info(y4m_frame_info_t *dest, y4m_frame_info_t *src){  if ((dest == NULL) || (src == NULL)) return;  /* copy info */  y4m_copy_xtag_list(&(dest->x_tags), &(src->x_tags));}void y4m_fini_frame_info(y4m_frame_info_t *info){  if (info == NULL) return;  y4m_fini_xtag_list(&(info->x_tags));}/************************************************************************* * * Tag parsing  * *************************************************************************/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 */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -