亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? spudec.cpp

?? 從FFMPEG轉(zhuǎn)換而來(lái)的H264解碼程序,VC下編譯..
?? CPP
?? 第 1 頁(yè) / 共 3 頁(yè)
字號(hào):
/* SPUdec.c
   Skeleton of function spudec_process_controll() is from xine sources.
   Further works:
   LGB,... (yeah, try to improve it and insert your name here! ;-)

   Kim Minh Kaplan
   implement fragments reassembly, RLE decoding.
   read brightness from the IFO.

   For information on SPU format see <URL:http://sam.zoy.org/doc/dvd/subtitles/>
   and <URL:http://members.aol.com/mpucoder/DVD/spu.html>

 */

// to ffdshow imported from mplayer

#include "stdafx.h"
#include "ffImgfmt.h"
#include "spudec.h"
#include "postproc/swscale.h"
#include "Tlibmplayer.h"
#include "IffdshowBase.h"
#include "ffdshow_constants.h"
#include "Tconfig.h"
#include "ffdebug.h"

/* Valid values for spu_aamode:
   0: none (fastest, most ugly)
   1: approximate
   2: full (slowest)
   3: bilinear (similiar to vobsub, fast and not too bad)
   4: uses swscaler gaussian (this is the only one that looks good)
 */
/*
Tspudec::Tspudec(IffdshowBase *Ideci):deci(Ideci)
{
 spu_aamode = 3;
 spu_alignment = -1;
 spu_gaussvar = 1.0;
 sub_pos=0;
 firsttime=1;

}
*/
void Tspudec::spudec_queue_packet( packet_t *packet)
{
  if (queue_head == NULL)
    queue_head = packet;
  else
    queue_tail->next = packet;
  queue_tail = packet;
}

Tspudec::packet_t* Tspudec::spudec_dequeue_packet()
{
  packet_t *retval = queue_head;

  queue_head = retval->next;
  if (queue_head == NULL)
    queue_tail = NULL;

  return retval;
}

void Tspudec::spudec_free_packet(packet_t *packet)
{
  if (packet->packet != NULL)
    free(packet->packet);
  free(packet);
}

unsigned int Tspudec::get_be16(const unsigned char *p)
{
  return (p[0] << 8) + p[1];
}

unsigned int Tspudec::get_be24(const unsigned char *p)
{
  return (get_be16(p) << 8) + p[2];
}

void Tspudec::next_line(packet_t *packet)
{
  if (packet->current_nibble[packet->deinterlace_oddness] % 2)
    packet->current_nibble[packet->deinterlace_oddness]++;
  packet->deinterlace_oddness = (packet->deinterlace_oddness + 1) % 2;
}

unsigned char Tspudec::get_nibble(packet_t *packet)
{
  unsigned char nib;
  unsigned int *nibblep = packet->current_nibble + packet->deinterlace_oddness;
  if (*nibblep / 2 >= packet->control_start) {
    DPRINTF( _l("SPUdec: ERROR: get_nibble past end of packet"));
    return 0;
  }
  nib = packet->packet[*nibblep / 2];
  if (*nibblep % 2)
    nib &= 0xf;
  else
    nib >>= 4;
  ++*nibblep;
  return nib;
}

/* Cut the sub to visible part */
void Tspudec::spudec_cut_image(void)
{
  unsigned int fy, ly;
  unsigned int first_y, last_y;
  unsigned char *image;
  unsigned char *aimage;

  if (this->stride == 0 || this->height == 0) {
    return;
  }

  for (fy = 0; fy < this->image_size && !this->aimage[fy]; fy++);
  for (ly = this->stride * this->height-1; ly && !this->aimage[ly]; ly--);
  first_y = fy / this->stride;
  last_y = ly / this->stride;
  //printf("first_y: %d, last_y: %d", first_y, last_y);
  this->start_row += first_y;

  // Some subtitles trigger this condition
  if (last_y + 1 > first_y ) {
          this->height = last_y - first_y +1;
  } else {
          this->height = 0;
          this->image_size = 0;
          return;
  }

//  printf("new h %d new start %d (sz %d st %d)---\n", this->height, this->start_row, this->image_size, this->stride);

  image = (unsigned char*)malloc(2 * this->stride * this->height);
  if(image){
    this->image_size = this->stride * this->height;
    aimage = image + this->image_size;
    memcpy(image, this->image + this->stride * first_y, this->image_size);
    memcpy(aimage, this->aimage + this->stride * first_y, this->image_size);
    free(this->image);
    this->image = image;
    this->aimage = aimage;
  } else {
    DPRINTF(_l("Fatal: update_spu: malloc requested %d bytes"), 2 * this->stride * this->height);
  }
}

int Tspudec::mkalpha(int i)
{
  /* In mplayer's alpha planes, 0 is transparent, then 1 is nearly
     opaque upto 255 which is transparent */
  switch (i) {
  case 0xf:
    return 1;
  case 0:
    return 0;
  default:
    return (0xf - i) << 4;
  }
}

void Tspudec::spudec_process_data( packet_t *packet)
{
  unsigned int cmap[4], alpha[4];
  unsigned int i, x, y;

  this->scaled_frame_width = 0;
  this->scaled_frame_height = 0;
  this->start_col = packet->start_col;
  this->end_col = packet->end_col;
  this->start_row = packet->start_row;
  this->end_row = packet->end_row;
  this->height = packet->height;
  this->width = packet->width;
  this->stride = packet->stride;
  for (i = 0; i < 4; ++i) {
    alpha[i] = mkalpha(packet->alpha[i]);
    if (alpha[i] == 0)
      cmap[i] = 0;
    else if (this->custom){
      cmap[i] = this->cuspal[i].Y;
      if (cmap[i] + alpha[i] > 255)
        cmap[i] = 256 - alpha[i];
    }
    else {
      cmap[i] = this->global_palette[packet->palette[i]].Y;
      if (cmap[i] + alpha[i] > 255)
        cmap[i] = 256 - alpha[i];
    }
  }

  if (this->image_size < this->stride * this->height) {
    if (this->image != NULL) {
      free(this->image);
      this->image_size = 0;
    }
    this->image = (unsigned char*)malloc(2 * this->stride * this->height);
    if (this->image) {
      this->image_size = this->stride * this->height;
      this->aimage = this->image + this->image_size;
    }
  }
  if (this->image == NULL)
    return;

  /* Kludge: draw_alpha needs width multiple of 8. */
  if (this->width < this->stride)
    for (y = 0; y < this->height; ++y) {
      memset(this->aimage + y * this->stride + this->width, 0, this->stride - this->width);
      /* FIXME: Why is this one needed? */
      memset(this->image + y * this->stride + this->width, 0, this->stride - this->width);
    }

  i = packet->current_nibble[1];
  x = 0;
  y = 0;
  while (packet->current_nibble[0] < i
         && packet->current_nibble[1] / 2 < packet->control_start
         && y < this->height) {
    unsigned int len, color;
    unsigned int rle = 0;
    rle = get_nibble(packet);
    if (rle < 0x04) {
      rle = (rle << 4) | get_nibble(packet);
      if (rle < 0x10) {
        rle = (rle << 4) | get_nibble(packet);
        if (rle < 0x040) {
          rle = (rle << 4) | get_nibble(packet);
          if (rle < 0x0004)
            rle |= ((this->width - x) << 2);
        }
      }
    }
    color = 3 - (rle & 0x3);
    len = rle >> 2;
    if (len > this->width - x || len == 0)
      len = this->width - x;
    /* FIXME have to use palette and alpha map*/
    memset(this->image + y * this->stride + x, cmap[color], len);
    memset(this->aimage + y * this->stride + x, alpha[color], len);
    x += len;
    if (x >= this->width) {
      next_line(packet);
      x = 0;
      ++y;
    }
  }
  spudec_cut_image();
}


/*
  This function tries to create a usable palette.
  It determines how many non-transparent colors are used, and assigns different
gray scale values to each color.
  I tested it with four streams and even got something readable. Half of the
times I got black characters with white around and half the reverse.
*/
void Tspudec::compute_palette(packet_t *packet)
{
  int used[16],i,cused,start,step,color;

  memset(used, 0, sizeof(used));
  for (i=0; i<4; i++)
    if (packet->alpha[i]) /* !Transparent? */
       used[packet->palette[i]] = 1;
  for (cused=0, i=0; i<16; i++)
    if (used[i]) cused++;
  if (!cused) return;
  if (cused == 1) {
    start = 0x80;
    step = 0;
  } else {
    start = font_start_level;
    step = (0xF0-font_start_level)/(cused-1);
  }
  memset(used, 0, sizeof(used));
  for (i=0; i<4; i++) {
    color = packet->palette[i];
    if (packet->alpha[i] && !used[color]) { /* not assigned? */
       used[color] = 1;
       global_palette[color].Y = UCHAR(start);
       start += step;
    }
  }
}

void Tspudec::spudec_process_control( unsigned int pts100)
{
  int a,b; /* Temporary vars */
  unsigned int date, type;
  unsigned int off;
  unsigned int start_off = 0;
  unsigned int next_off;
  unsigned int start_pts=0;
  unsigned int end_pts=0;
  unsigned int current_nibble[2];
  unsigned int control_start;
  unsigned int display = 0;
  unsigned int start_col = 0;
  unsigned int end_col = 0;
  unsigned int start_row = 0;
  unsigned int end_row = 0;
  unsigned int width = 0;
  unsigned int height = 0;
  unsigned int stride = 0;

  control_start = get_be16(this->packet + 2);
  next_off = control_start;
  while (start_off != next_off) {
    start_off = next_off;
    date = get_be16(this->packet + start_off) * 1024;
    next_off = get_be16(this->packet + start_off + 2);
    DPRINTF( _l("date=%d"), date);
    off = start_off + 4;
    for (type = this->packet[off++]; type != 0xff; type = this->packet[off++]) {
      DPRINTF( _l("cmd=%d  "),type);
      switch(type) {
      case 0x00:
        /* Menu ID, 1 byte */
        DPRINTF(_l("Menu ID"));
        /* shouldn't a Menu ID type force display start? */
        start_pts = pts100 + date;
        end_pts = UINT_MAX;
        display = 1;
        this->is_forced_sub=(unsigned int)~0; // current subtitle is forced
        break;
      case 0x01:
        /* Start display */
        start_pts = pts100 + date;
        end_pts = UINT_MAX;
        display = 1;
        DPRINTF(_l("Start display! %i"),start_pts);
        this->is_forced_sub=0;
        break;
      case 0x02:
        /* Stop display */
        end_pts = pts100 + date;
        DPRINTF(_l("Stop display! %i"),end_pts);
        break;
      case 0x03:
        /* Palette */
        this->palette[0] = this->packet[off] >> 4;
        this->palette[1] = this->packet[off] & 0xf;
        this->palette[2] = this->packet[off + 1] >> 4;
        this->palette[3] = this->packet[off + 1] & 0xf;
        DPRINTF(_l("Palette %d, %d, %d, %d"), this->palette[0], this->palette[1], this->palette[2], this->palette[3]);
        off+=2;
        break;
      case 0x04:
        /* Alpha */
        this->alpha[0] = this->packet[off] >> 4;
        this->alpha[1] = this->packet[off] & 0xf;
        this->alpha[2] = this->packet[off + 1] >> 4;
        this->alpha[3] = this->packet[off + 1] & 0xf;
        DPRINTF(_l("Alpha %d, %d, %d, %d"),  this->alpha[0], this->alpha[1], this->alpha[2], this->alpha[3]);
        off+=2;
        break;
      case 0x05:
        /* Co-ords */
        a = get_be24(this->packet + off);
        b = get_be24(this->packet + off + 3);
        start_col = a >> 12;
        end_col = a & 0xfff;
        width = (end_col < start_col) ? 0 : end_col - start_col + 1;
        stride = (width + 7) & ~7; /* Kludge: draw_alpha needs width multiple of 8 */
        start_row = b >> 12;
        end_row = b & 0xfff;

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
av午夜精品一区二区三区| 麻豆成人免费电影| 久久综合999| 日韩欧美视频在线| 51午夜精品国产| 欧美精品色综合| 欧美一区二区网站| 日韩三级伦理片妻子的秘密按摩| 欧美伦理电影网| 欧美久久久久久蜜桃| 欧美精品日韩一区| 欧美tickling挠脚心丨vk| 欧美国产乱子伦 | 国产人妖乱国产精品人妖| 久久久久国产免费免费 | 亚洲品质自拍视频网站| 亚洲激情综合网| 丝袜美腿亚洲色图| 久久国产精品72免费观看| 国产一区中文字幕| 色狠狠色狠狠综合| 日韩欧美第一区| 欧美激情在线一区二区| 亚洲男女一区二区三区| 亚洲va韩国va欧美va| 日本午夜一本久久久综合| 久久精品国产亚洲一区二区三区| 国产69精品久久777的优势| 一本久道中文字幕精品亚洲嫩| 欧美色爱综合网| 久久综合狠狠综合| 亚洲人成在线播放网站岛国| 亚洲成人在线观看视频| 狠狠色狠狠色综合日日91app| 成人午夜激情视频| 欧美人妇做爰xxxⅹ性高电影| 久久久久久久久久看片| 亚洲桃色在线一区| 久久国产精品区| 色欧美日韩亚洲| 精品美女被调教视频大全网站| 中文字幕第一区二区| 亚洲成人一区在线| 亚洲欧美激情一区二区| 激情综合色综合久久| 亚洲无人区一区| 秋霞成人午夜伦在线观看| 国产精品嫩草久久久久| 国产精品久久久一本精品| 久久婷婷综合激情| 亚洲国产精品天堂| av午夜一区麻豆| 久久精品亚洲乱码伦伦中文| 五月婷婷久久丁香| 色综合久久久久综合99| 欧美国产激情二区三区| 久久不见久久见中文字幕免费| 色婷婷一区二区三区四区| www久久精品| 日韩av电影免费观看高清完整版在线观看| 北岛玲一区二区三区四区| 久久久亚洲精品石原莉奈| 亚洲视频综合在线| 成人免费福利片| 国产不卡视频在线观看| 91精品蜜臀在线一区尤物| 亚洲视频一区二区在线| 成人美女视频在线观看18| 一区二区中文视频| 国产麻豆视频精品| 欧洲av在线精品| 国产精品美日韩| 国产精品久久久久久妇女6080| 韩国一区二区三区| 精品入口麻豆88视频| 美女爽到高潮91| 欧美电视剧免费观看| 欧美bbbbb| 欧美成人a∨高清免费观看| 日本不卡中文字幕| 欧美一区二区成人| 极品少妇一区二区| 久久久精品2019中文字幕之3| 麻豆国产欧美一区二区三区| 91精品国产色综合久久ai换脸| 午夜欧美在线一二页| 欧美精品乱码久久久久久按摩| 五月天中文字幕一区二区| 51午夜精品国产| 精品夜夜嗨av一区二区三区| 精品国产91乱码一区二区三区| 久久综合综合久久综合| 久久久国产精华| 97se亚洲国产综合自在线不卡| 亚洲欧美日韩国产综合| 欧美色倩网站大全免费| 免费三级欧美电影| 国产婷婷一区二区| 色综合久久中文综合久久97| 午夜精品久久久久久久| 欧美不卡在线视频| jizzjizzjizz欧美| 在线观看一区二区视频| 一区二区三区自拍| 这里是久久伊人| 国产精品99久久不卡二区| 国产精品久久久久久久久快鸭 | 中文av一区二区| 91传媒视频在线播放| 日本一区中文字幕| 中文字幕一区二区三| 欧美久久一二区| 成人免费视频app| 日韩一区精品视频| 国产精品乱码一区二三区小蝌蚪| 欧美午夜免费电影| 成人午夜碰碰视频| 丝袜脚交一区二区| 国产精品狼人久久影院观看方式| 欧美老女人第四色| k8久久久一区二区三区| 日韩国产一区二| 亚洲欧美一区二区三区孕妇| 91精品国产综合久久精品| 91片在线免费观看| 国产麻豆精品theporn| 亚洲高清久久久| 国产精品狼人久久影院观看方式| 欧美顶级少妇做爰| 色综合一区二区| 高清国产午夜精品久久久久久| 午夜精品爽啪视频| 亚洲精品老司机| 欧美—级在线免费片| 欧美不卡一区二区三区| 91精品国产综合久久香蕉麻豆| 91浏览器入口在线观看| 盗摄精品av一区二区三区| 精品亚洲成a人在线观看| 亚洲成av人片观看| 亚洲午夜精品在线| 亚洲欧美色图小说| 国产精品乱码一区二区三区软件| 中文字幕一区日韩精品欧美| 日韩精品一区二区三区在线观看| 欧美性大战久久| 91在线视频播放地址| 成人动漫精品一区二区| 国产高清一区日本| 国产不卡视频一区二区三区| 国产成人亚洲综合a∨婷婷| 国产麻豆精品视频| 国产成人精品一区二区三区四区 | 国产精品99久久久久久久vr| 久久国产精品无码网站| 美女网站色91| 韩国欧美国产一区| 国产成人无遮挡在线视频| 国产精品一卡二卡在线观看| 国产精品资源网站| 成人一区二区三区视频在线观看 | 五月天一区二区三区| 午夜成人在线视频| 日本欧美肥老太交大片| 韩国成人精品a∨在线观看| 国产精品456| 99国产麻豆精品| 欧美三级电影网站| 91精品国产全国免费观看| 日韩欧美国产系列| 久久网站热最新地址| 国产精品白丝在线| 亚洲主播在线观看| 美女一区二区在线观看| 国产在线不卡一卡二卡三卡四卡| 国产一区二区精品久久91| 成人一道本在线| 在线看日韩精品电影| 欧美刺激午夜性久久久久久久| 精品国产区一区| 中文字幕在线一区| 日韩成人伦理电影在线观看| 精品综合久久久久久8888| 成人黄色av电影| 欧美日韩国产乱码电影| 精品国产一二三| 亚洲视频在线观看三级| 日韩激情视频网站| 国产99久久久精品| 欧美日韩精品欧美日韩精品| 久久夜色精品一区| 亚洲精品国产无套在线观| 日韩av不卡一区二区| 成人av电影在线| 日韩视频在线你懂得| 亚洲人成网站影音先锋播放| 国产中文一区二区三区| 欧美性生活久久| 国产精品视频免费看| 日韩成人一区二区三区在线观看|