summaryrefslogtreecommitdiffstats
path: root/libmpdemux/video.c
diff options
context:
space:
mode:
authormichael <michael@b3059339-0415-0410-9bf9-f77b7e298cf2>2003-04-04 15:38:46 +0000
committermichael <michael@b3059339-0415-0410-9bf9-f77b7e298cf2>2003-04-04 15:38:46 +0000
commite419df6f8582898cb8ff592d66dd0bba317268da (patch)
tree200cf5233a3703d86fe1be09ddd7ef560aee6536 /libmpdemux/video.c
parent3eea968d2430da35aaadb3cb7db399fe27db2866 (diff)
downloadmpv-e419df6f8582898cb8ff592d66dd0bba317268da.tar.bz2
mpv-e419df6f8582898cb8ff592d66dd0bba317268da.tar.xz
H264-ES demuxer
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@9825 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libmpdemux/video.c')
-rw-r--r--libmpdemux/video.c50
1 files changed, 50 insertions, 0 deletions
diff --git a/libmpdemux/video.c b/libmpdemux/video.c
index fcf6e6c220..295cb352f4 100644
--- a/libmpdemux/video.c
+++ b/libmpdemux/video.c
@@ -126,6 +126,46 @@ switch(d_video->demuxer->file_format){
sh_video->format=0x10000004;
break;
}
+ case DEMUXER_TYPE_H264_ES: {
+ videobuf_len=0; videobuf_code_len=0;
+ mp_msg(MSGT_DECVIDEO,MSGL_V,"Searching for sequence parameter set... ");fflush(stdout);
+ while(1){
+ int i=sync_video_packet(d_video);
+ if((i&~0x60) == 0x107 && i != 0x107) break; // found it!
+ if(!i || !skip_video_packet(d_video)){
+ mp_msg(MSGT_DECVIDEO,MSGL_V,"NONE :(\n");
+ return 0;
+ }
+ }
+ mp_msg(MSGT_DECVIDEO,MSGL_V,"OK!\n");
+ if(!videobuffer) videobuffer=(char*)memalign(8,VIDEOBUFFER_SIZE);
+ if(!videobuffer){
+ mp_msg(MSGT_DECVIDEO,MSGL_ERR,MSGTR_ShMemAllocFail);
+ return 0;
+ }
+ mp_msg(MSGT_DECVIDEO,MSGL_V,"Searching for picture parameter set... ");fflush(stdout);
+ while(1){
+ int i=sync_video_packet(d_video);
+ printf("0x%X\n",i);
+ if((i&~0x60) == 0x108 && i != 0x108) break; // found it!
+ if(!i || !read_video_packet(d_video)){
+ mp_msg(MSGT_DECVIDEO,MSGL_V,"NONE :(\n");
+ return 0;
+ }
+ }
+ mp_msg(MSGT_DECVIDEO,MSGL_V,"OK!\nSearching for Slice... ");fflush(stdout);
+ while(1){
+ int i=sync_video_packet(d_video);
+ if((i&~0x60) == 0x101 || (i&~0x60) == 0x102 || (i&~0x60) == 0x105) break; // found it!
+ if(!i || !read_video_packet(d_video)){
+ mp_msg(MSGT_DECVIDEO,MSGL_V,"NONE :(\n");
+ return 0;
+ }
+ }
+ mp_msg(MSGT_DECVIDEO,MSGL_V,"OK!\n");
+ sh_video->format=0x10000005;
+ break;
+ }
#ifdef STREAMING_LIVE_DOT_COM
case DEMUXER_TYPE_RTP:
// If the RTP stream is a MPEG stream, then we use this code to check
@@ -371,6 +411,16 @@ int video_read_frame(sh_video_t* sh_video,float* frame_time_ptr,unsigned char**
*start=videobuffer; in_size=videobuf_len;
videobuf_len=0;
+ } else if(demuxer->file_format==DEMUXER_TYPE_H264_ES){
+ //
+ while(videobuf_len<VIDEOBUFFER_SIZE-MAX_VIDEO_PACKET_SIZE){
+ int i=sync_video_packet(d_video);
+ if(!read_video_packet(d_video)) return -1; // EOF
+ if((i&~0x60) == 0x101 || (i&~0x60) == 0x102 || (i&~0x60) == 0x105) break;
+ }
+ *start=videobuffer; in_size=videobuf_len;
+ videobuf_len=0;
+
} else {
// frame-based file formats: (AVI,ASF,MOV)
in_size=ds_get_packet(d_video,start);