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

📄 demux_mkv.c

📁 自己移植的linux下的流媒体播放器原代码,支持mms协议,支持ftp和http协议.
💻 C
📖 第 1 页 / 共 5 页
字号:
/* * native Matroska demuxer * Written by Aurelien Jacobs <aurel@gnuage.org> * Based on the one written by Ronald Bultje for gstreamer *   and on demux_mkv.cpp from Moritz Bunkus. * Licence: GPL */#include "config.h"#ifdef HAVE_MATROSKA#include <stdlib.h>#include <stdio.h>#include <ctype.h>#include "stream.h"#include "demuxer.h"#include "stheader.h"#include "ebml.h"#include "matroska.h"#include "bswap.h"#include "../subreader.h"#include "../libvo/sub.h"#ifdef USE_QTX_CODECS#include "qtx/qtxsdk/components.h"#endif#ifdef HAVE_ZLIB#include <zlib.h>#endif#ifdef USE_LIBLZO#include <lzo1x.h>#else#include "../libmpcodecs/native/minilzo.h"#endif#if !defined(MIN)#define MIN(a, b)	((a)<(b)?(a):(b))#endif#if !defined(MAX)#define MAX(a, b)	((a)>(b)?(a):(b))#endiftypedef struct{  uint32_t order, type, scope;  uint32_t comp_algo;  uint8_t *comp_settings;  int comp_settings_len;} mkv_content_encoding_t;typedef struct mkv_track{  int tnum;    char *codec_id;  int ms_compat;  char *language;  int type;    uint32_t v_width, v_height, v_dwidth, v_dheight;  float v_frate;  uint32_t a_formattag;  uint32_t a_channels, a_bps;  float a_sfreq;  float default_duration;  int default_track;  void *private_data;  unsigned int private_size;  /* for vorbis audio */  unsigned char *headers[3];  uint32_t header_sizes[3];  /* stuff for realmedia */  int realmedia;  int rv_kf_base, rv_kf_pts;  float rv_pts;  /* previous video timestamp */  float ra_pts;  /* previous audio timestamp */  /* stuff for quicktime */  int fix_i_bps;  float qt_last_a_pts;  int subtitle_type;  /* The timecodes of video frames might have to be reordered if they're     in display order (the timecodes, not the frames themselves!). In this     case demux packets have to be cached with the help of these variables. */  int reorder_timecodes;  demux_packet_t **cached_dps;  int num_cached_dps, num_allocated_dps;  float max_pts;  /* generic content encoding support */  mkv_content_encoding_t *encodings;  int num_encodings;  /* For VobSubs */  mkv_sh_sub_t sh_sub;} mkv_track_t;typedef struct mkv_index{  int tnum;  uint64_t timecode, filepos;} mkv_index_t;typedef struct mkv_chapter{  uint64_t start, end;} mkv_chapter_t;typedef struct mkv_demuxer{  off_t segment_start;  float duration, last_pts;  uint64_t last_filepos;  mkv_track_t **tracks;  int num_tracks;  uint64_t tc_scale, cluster_tc, first_tc;  int has_first_tc;  uint64_t clear_subs_at[SUB_MAX_TEXT];  subtitle subs;  uint64_t cluster_size;  uint64_t blockgroup_size;  mkv_index_t *indexes;  int num_indexes;  off_t *parsed_cues;  int parsed_cues_num;  off_t *parsed_seekhead;  int parsed_seekhead_num;  uint64_t *cluster_positions;  int num_cluster_pos;  int64_t skip_to_timecode;  int v_skip_to_keyframe, a_skip_to_keyframe;  mkv_chapter_t *chapters;  int num_chapters;  int64_t stop_timecode;} mkv_demuxer_t;typedef struct{  uint32_t chunks;              /* number of chunks */  uint32_t timestamp;           /* timestamp from packet header */  uint32_t len;                 /* length of actual data */  uint32_t chunktab;            /* offset to chunk offset array */} dp_hdr_t;typedef struct __attribute__((__packed__)){  uint32_t size;  uint32_t fourcc1;  uint32_t fourcc2;  uint16_t width;  uint16_t height;  uint16_t bpp;  uint32_t unknown1;  uint32_t fps;  uint32_t type1;  uint32_t type2;} real_video_props_t;typedef struct __attribute__((__packed__)){  uint32_t fourcc1;             /* '.', 'r', 'a', 0xfd */  uint16_t version1;            /* 4 or 5 */  uint16_t unknown1;            /* 00 000 */  uint32_t fourcc2;             /* .ra4 or .ra5 */  uint32_t unknown2;            /* ??? */  uint16_t version2;            /* 4 or 5 */  uint32_t header_size;         /* == 0x4e */  uint16_t flavor;              /* codec flavor id */  uint32_t coded_frame_size;    /* coded frame size */  uint32_t unknown3;            /* big number */  uint32_t unknown4;            /* bigger number */  uint32_t unknown5;            /* yet another number */  uint16_t sub_packet_h;  uint16_t frame_size;  uint16_t sub_packet_size;  uint16_t unknown6;            /* 00 00 */  uint16_t sample_rate;  uint16_t unknown8;            /* 0 */  uint16_t sample_size;  uint16_t channels;} real_audio_v4_props_t;typedef struct __attribute__((__packed__)){  uint32_t fourcc1;             /* '.', 'r', 'a', 0xfd */  uint16_t version1;            /* 4 or 5 */  uint16_t unknown1;            /* 00 000 */  uint32_t fourcc2;             /* .ra4 or .ra5 */  uint32_t unknown2;            /* ??? */  uint16_t version2;            /* 4 or 5 */  uint32_t header_size;         /* == 0x4e */  uint16_t flavor;              /* codec flavor id */  uint32_t coded_frame_size;    /* coded frame size */  uint32_t unknown3;            /* big number */  uint32_t unknown4;            /* bigger number */  uint32_t unknown5;            /* yet another number */  uint16_t sub_packet_h;  uint16_t frame_size;  uint16_t sub_packet_size;  uint16_t unknown6;            /* 00 00 */  uint8_t unknown7[6];          /* 0, srate, 0 */  uint16_t sample_rate;  uint16_t unknown8;            /* 0 */  uint16_t sample_size;  uint16_t channels;  uint32_t genr;                /* "genr" */  uint32_t fourcc3;             /* fourcc */} real_audio_v5_props_t;/* for e.g. "-slang ger" */extern char *dvdsub_lang;extern char *audio_lang;extern int dvdsub_id;extern int demux_aid_vid_mismatch;static mkv_track_t *demux_mkv_find_track_by_num (mkv_demuxer_t *d, int n, int type){  int i, id;  for (i=0, id=0; i < d->num_tracks; i++)    if (d->tracks[i] != NULL && d->tracks[i]->type == type)      if (id++ == n)        return d->tracks[i];    return NULL;}static mkv_track_t *demux_mkv_find_track_by_language (mkv_demuxer_t *d, char *language, int type){  int i, len;    language += strspn(language,",");  while((len = strcspn(language,",")) > 0)    {      for (i=0; i < d->num_tracks; i++)        if (d->tracks[i] != NULL && d->tracks[i]->language != NULL &&            d->tracks[i]->type == type &&            !strncmp(d->tracks[i]->language, language, len))          return d->tracks[i];      language += len;      language += strspn(language,",");    }    return NULL;}static voidadd_cluster_position (mkv_demuxer_t *mkv_d, uint64_t position){  int i = mkv_d->num_cluster_pos;  while (i--)    if (mkv_d->cluster_positions[i] == position)      return;  if (!mkv_d->cluster_positions)    mkv_d->cluster_positions = (uint64_t *) malloc (32 * sizeof (uint64_t));  else if (!(mkv_d->num_cluster_pos % 32))    mkv_d->cluster_positions = (uint64_t *) realloc(mkv_d->cluster_positions,                                                    (mkv_d->num_cluster_pos+32)                                                    * sizeof (uint64_t));  mkv_d->cluster_positions[mkv_d->num_cluster_pos++] = position;}#define AAC_SYNC_EXTENSION_TYPE 0x02b7static intaac_get_sample_rate_index (uint32_t sample_rate){  if (92017 <= sample_rate)    return 0;  else if (75132 <= sample_rate)    return 1;  else if (55426 <= sample_rate)    return 2;  else if (46009 <= sample_rate)    return 3;  else if (37566 <= sample_rate)    return 4;  else if (27713 <= sample_rate)    return 5;  else if (23004 <= sample_rate)    return 6;  else if (18783 <= sample_rate)    return 7;  else if (13856 <= sample_rate)    return 8;  else if (11502 <= sample_rate)    return 9;  else if (9391 <= sample_rate)    return 10;  else    return 11;}static intvobsub_parse_size (mkv_track_t *t, const char *start){  if (sscanf(&start[6], "%dx%d", &t->sh_sub.width, &t->sh_sub.height) == 2)    {      mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] VobSub size: %ux%u\n",             t->sh_sub.width, t->sh_sub.height);      return 1;    }  return 0;}static intvobsub_parse_palette (mkv_track_t *t, const char *start){  int i, r, g, b, y, u, v, tmp;  start += 8;  while (isspace(*start))    start++;  for (i = 0; i < 16; i++)    {      if (sscanf(start, "%06x", &tmp) != 1)        break;      r = tmp >> 16 & 0xff;      g = tmp >> 8 & 0xff;      b = tmp & 0xff;      y = MIN(MAX((int)(0.1494 * r + 0.6061 * g + 0.2445 * b), 0),              0xff);      u = MIN(MAX((int)(0.6066 * r - 0.4322 * g - 0.1744 * b) + 128,                  0), 0xff);      v = MIN(MAX((int)(-0.08435 * r - 0.3422 * g + 0.4266 * b) +                  128, 0), 0xff);      t->sh_sub.palette[i] = y << 16 | u << 8 | v;      start += 6;      while ((*start == ',') || isspace(*start))        start++;    }  if (i == 16)    {      mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] VobSub palette: %06x,%06x,"             "%06x,%06x,%06x,%06x,%06x,%06x,%06x,%06x,%06x,%06x,%06x,"             "%06x,%06x,%06x\n", t->sh_sub.palette[0],             t->sh_sub.palette[1], t->sh_sub.palette[2],             t->sh_sub.palette[3], t->sh_sub.palette[4],             t->sh_sub.palette[5], t->sh_sub.palette[6],             t->sh_sub.palette[7], t->sh_sub.palette[8],             t->sh_sub.palette[9], t->sh_sub.palette[10],             t->sh_sub.palette[11], t->sh_sub.palette[12],             t->sh_sub.palette[13], t->sh_sub.palette[14],             t->sh_sub.palette[15]);      t->sh_sub.has_palette = 1;      return 2;    }  return 0;}static intvobsub_parse_custom_colors (mkv_track_t *t, const char *start){  int use_custom_colors, i;  use_custom_colors = 0;  start += 14;  while (isspace(*start))    start++;   if (!strncasecmp(start, "ON", 2) || (*start == '1'))     use_custom_colors = 1;   else if (!strncasecmp(start, "OFF", 3) || (*start == '0'))     use_custom_colors = 0;   mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] VobSub custom colors: %s\n",          use_custom_colors ? "ON" : "OFF");   if ((start = strstr(start, "colors:")) != NULL)     {       start += 7;       while (isspace(*start))         start++;       for (i = 0; i < 4; i++)         {           if (sscanf(start, "%06x", &t->sh_sub.colors[i]) != 1)             break;           start += 6;           while ((*start == ',') || isspace(*start))             start++;         }       if (i == 4)         {           t->sh_sub.custom_colors = 4;           mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] VobSub colors: %06x,"                  "%06x,%06x,%06x\n", t->sh_sub.colors[0],                  t->sh_sub.colors[1], t->sh_sub.colors[2],                  t->sh_sub.colors[3]);         }     }   if (!use_custom_colors)     t->sh_sub.custom_colors = 0;   return 4;}static intvobsub_parse_forced_subs (mkv_track_t *t, const char *start){  start += 12;  while (isspace(*start))    start++;  if (!strncasecmp(start, "on", 2) || (*start == '1'))

⌨️ 快捷键说明

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