mves.c
上传用户:wstnjxml
上传日期:2014-04-03
资源大小:7248k
文件大小:4k
源码类别:

Windows CE

开发平台:

C/C++

  1. /*****************************************************************************
  2.  *
  3.  * This program is free software ; you can redistribute it and/or modify
  4.  * it under the terms of the GNU General Public License as published by
  5.  * the Free Software Foundation; either version 2 of the License, or
  6.  * (at your option) any later version.
  7.  *
  8.  * This program is distributed in the hope that it will be useful,
  9.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11.  * GNU General Public License for more details.
  12.  *
  13.  * You should have received a copy of the GNU General Public License
  14.  * along with this program; if not, write to the Free Software
  15.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  16.  *
  17.  * $Id: mves.c 543 2006-01-07 22:06:24Z picard $
  18.  *
  19.  * The Core Pocket Media Player
  20.  * Copyright (c) 2004-2005 Gabor Kovacs
  21.  *
  22.  ****************************************************************************/
  23. #include "../common/common.h"
  24. #include "mpeg1.h"
  25. #include "mpeg_decode.h"
  26. #include "mpeg_stream.h"
  27. typedef struct mves
  28. {
  29. format_base Format;
  30. int LastSeekPos;
  31. tick_t LastSeekTime;
  32. } mves;
  33. static int Init(mves* p)
  34. {
  35. format_stream* s = Format_AddStream(&p->Format,sizeof(format_stream));
  36. if (s)
  37. {
  38. format_reader* Reader = p->Format.Reader;
  39. uint8_t Head[20];
  40. tchar_t URL[MAXPATH];
  41. PacketFormatClear(&s->Format);
  42. s->Format.Type = PACKET_VIDEO;
  43. s->Format.Format.Video.Pixel.Flags = PF_FOURCC | PF_FRAGMENTED;
  44. s->Format.Format.Video.Pixel.FourCC = FOURCC('M','P','E','G');
  45. if (p->Format.Reader->Input->Get(p->Format.Reader->Input,STREAM_URL,URL,sizeof(URL))==ERR_NONE &&
  46. CheckExts(URL,T("m4v:V")) != 0)
  47. s->Format.Format.Video.Pixel.FourCC = FOURCC('M','P','4','V');
  48. if (Reader->Read(Reader,Head,sizeof(Head))==sizeof(Head))
  49. {
  50. int i;
  51. if (Head[0]==0 && Head[1]==0 && (Head[2]>>2)==0x20)
  52. s->Format.Format.Video.Pixel.FourCC = FOURCC('H','2','6','3');
  53. else
  54. for (i=0;i<20-4;++i)
  55. if (Head[i]==0 && Head[i+1]==0 && Head[i+2]==1)
  56. {
  57. if (Head[i+3]==0xB0)
  58. s->Format.Format.Video.Pixel.FourCC = FOURCC('M','P','4','V');
  59. else
  60. if (Head[i+3]==0xB3)
  61. s->Format.Format.Video.Pixel.FourCC = FOURCC('M','P','E','G');
  62. break;
  63. }
  64. }
  65. Reader->Seek(Reader,0,SEEK_SET);
  66. s->Fragmented = 1;
  67. Format_PrepairStream(&p->Format,s);
  68. }
  69. p->LastSeekPos = 0;
  70. p->LastSeekTime = 0;
  71. return ERR_NONE;
  72. }
  73. static int Seek(mves* p, tick_t Time, filepos_t FilePos,bool_t PrevKey)
  74. {
  75. packetformat Format;
  76. format_stream* Stream = p->Format.Streams[0];
  77. Format.ByteRate = 0;
  78. if (Stream->Pin.Node)
  79. Stream->Pin.Node->Get(Stream->Pin.Node,Stream->Pin.No|PIN_FORMAT,&Format,sizeof(Format));
  80. if (FilePos < 0)
  81. {
  82. if (Time > 0)
  83. {
  84. if (Format.ByteRate)
  85. FilePos = Scale(Time,Format.ByteRate,TICKSPERSEC);
  86. else
  87. return ERR_NOT_SUPPORTED;
  88. }
  89. else
  90. FilePos = 0;
  91. }
  92. else
  93. if (Format.ByteRate)
  94. Time = Scale(FilePos,TICKSPERSEC,Format.ByteRate);
  95. else
  96. Time = 1; //don't care (just not zero)
  97. p->LastSeekPos = FilePos;
  98. p->LastSeekTime = Time;
  99. return Format_Seek(&p->Format,FilePos,SEEK_SET);
  100. }
  101. static int ReadPacket(mves* p, format_reader* Reader, format_packet* Packet)
  102. {
  103. format_stream* Stream = p->Format.Streams[0];
  104. if (Reader->FilePos==0)
  105. Packet->RefTime = 0;
  106. else
  107. if (Reader->FilePos==p->LastSeekPos)
  108. Packet->RefTime = p->LastSeekTime;
  109. else
  110. Packet->RefTime = TIME_UNKNOWN;
  111. Packet->Data = Reader->ReadAsRef(Reader,-4096);
  112. Packet->Stream = Stream;
  113. return ERR_NONE;
  114. }
  115. static int Create(mves* p)
  116. {
  117. p->Format.Init = (fmtfunc)Init;
  118. p->Format.Seek = (fmtseek)Seek;
  119. p->Format.ReadPacket = (fmtreadpacket)ReadPacket;
  120. p->Format.MinHeaderLoad = MINBUFFER/2;
  121. return ERR_NONE;
  122. }
  123. static const nodedef MVES =
  124. {
  125. sizeof(mves),
  126. MVES_ID,
  127. FORMATBASE_CLASS,
  128. PRI_DEFAULT-5,
  129. (nodecreate)Create,
  130. NULL,
  131. };
  132. void MVES_Init()
  133. {
  134. NodeRegisterClass(&MVES);
  135. }
  136. void MVES_Done()
  137. {
  138. NodeUnRegisterClass(MVES_ID);
  139. }