Mercurial > mplayer.hg
annotate libmpdemux/parse_es.c @ 30378:8339bca8e4b4
Move the resync-related code into more consistent places instead of having it
scattered all over the place with half of it forgotten in some places.
author | reimar |
---|---|
date | Sun, 24 Jan 2010 15:16:39 +0000 |
parents | 0f1b5b68af32 |
children | b9c9e72a37b2 |
rev | line source |
---|---|
29238
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
23440
diff
changeset
|
1 /* |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
23440
diff
changeset
|
2 * MPEG-ES video parser |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
23440
diff
changeset
|
3 * |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
23440
diff
changeset
|
4 * This file is part of MPlayer. |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
23440
diff
changeset
|
5 * |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
23440
diff
changeset
|
6 * MPlayer is free software; you can redistribute it and/or modify |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
23440
diff
changeset
|
7 * it under the terms of the GNU General Public License as published by |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
23440
diff
changeset
|
8 * the Free Software Foundation; either version 2 of the License, or |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
23440
diff
changeset
|
9 * (at your option) any later version. |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
23440
diff
changeset
|
10 * |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
23440
diff
changeset
|
11 * MPlayer is distributed in the hope that it will be useful, |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
23440
diff
changeset
|
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
23440
diff
changeset
|
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
23440
diff
changeset
|
14 * GNU General Public License for more details. |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
23440
diff
changeset
|
15 * |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
23440
diff
changeset
|
16 * You should have received a copy of the GNU General Public License along |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
23440
diff
changeset
|
17 * with MPlayer; if not, write to the Free Software Foundation, Inc., |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
23440
diff
changeset
|
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
23440
diff
changeset
|
19 */ |
1376
d1fb303707d3
parse_es moved out from mplayer.c (it was included as .c file)
arpi
parents:
400
diff
changeset
|
20 |
d1fb303707d3
parse_es moved out from mplayer.c (it was included as .c file)
arpi
parents:
400
diff
changeset
|
21 #include <stdio.h> |
d1fb303707d3
parse_es moved out from mplayer.c (it was included as .c file)
arpi
parents:
400
diff
changeset
|
22 #include <stdlib.h> |
1430 | 23 #include <unistd.h> |
1376
d1fb303707d3
parse_es moved out from mplayer.c (it was included as .c file)
arpi
parents:
400
diff
changeset
|
24 |
d1fb303707d3
parse_es moved out from mplayer.c (it was included as .c file)
arpi
parents:
400
diff
changeset
|
25 #include "config.h" |
1973
5216f108cb4f
all error/warn/info messages moved to help_mp-en.h for translation
arpi
parents:
1430
diff
changeset
|
26 #include "mp_msg.h" |
5216f108cb4f
all error/warn/info messages moved to help_mp-en.h for translation
arpi
parents:
1430
diff
changeset
|
27 #include "help_mp.h" |
1376
d1fb303707d3
parse_es moved out from mplayer.c (it was included as .c file)
arpi
parents:
400
diff
changeset
|
28 |
22605
4d81dbdf46b9
Add explicit location for headers from the stream/ directory.
diego
parents:
17420
diff
changeset
|
29 #include "stream/stream.h" |
1376
d1fb303707d3
parse_es moved out from mplayer.c (it was included as .c file)
arpi
parents:
400
diff
changeset
|
30 #include "demuxer.h" |
d1fb303707d3
parse_es moved out from mplayer.c (it was included as .c file)
arpi
parents:
400
diff
changeset
|
31 #include "parse_es.h" |
1 | 32 |
33 //static unsigned char videobuffer[MAX_VIDEO_PACKET_SIZE]; | |
1376
d1fb303707d3
parse_es moved out from mplayer.c (it was included as .c file)
arpi
parents:
400
diff
changeset
|
34 unsigned char* videobuffer=NULL; |
d1fb303707d3
parse_es moved out from mplayer.c (it was included as .c file)
arpi
parents:
400
diff
changeset
|
35 int videobuf_len=0; |
17418 | 36 int next_nal = -1; |
37 ///! legacy variable, 4 if stream is synced, 0 if not | |
1376
d1fb303707d3
parse_es moved out from mplayer.c (it was included as .c file)
arpi
parents:
400
diff
changeset
|
38 int videobuf_code_len=0; |
1 | 39 |
17418 | 40 #define MAX_SYNCLEN (10 * 1024 * 1024) |
1 | 41 // sync video stream, and returns next packet code |
42 int sync_video_packet(demux_stream_t *ds){ | |
17418 | 43 if (!videobuf_code_len) { |
1 | 44 int skipped=0; |
17418 | 45 if (!demux_pattern_3(ds, NULL, MAX_SYNCLEN, &skipped, 0x100)) { |
17420 | 46 if (skipped == MAX_SYNCLEN) |
23440 | 47 mp_msg(MSGT_DEMUXER, MSGL_ERR, "parse_es: could not sync video stream!\n"); |
17418 | 48 goto eof_out; |
49 } | |
50 next_nal = demux_getc(ds); | |
51 if (next_nal < 0) | |
52 goto eof_out; | |
53 videobuf_code_len = 4; | |
54 if(skipped) mp_dbg(MSGT_PARSEES,MSGL_DBG2,"videobuf: %d bytes skipped (next: 0x1%02X)\n",skipped,next_nal); | |
1 | 55 } |
17418 | 56 return 0x100|next_nal; |
57 | |
58 eof_out: | |
59 next_nal = -1; | |
60 videobuf_code_len = 0; | |
61 return 0; | |
1 | 62 } |
63 | |
64 // return: packet length | |
65 int read_video_packet(demux_stream_t *ds){ | |
66 int packet_start; | |
17418 | 67 int res, read; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
68 |
16369 | 69 if (VIDEOBUFFER_SIZE - videobuf_len < 5) |
70 return 0; | |
1 | 71 // SYNC STREAM |
72 // if(!sync_video_packet(ds)) return 0; // cannot sync (EOF) | |
73 | |
74 // COPY STARTCODE: | |
75 packet_start=videobuf_len; | |
17418 | 76 videobuffer[videobuf_len+0]=0; |
77 videobuffer[videobuf_len+1]=0; | |
78 videobuffer[videobuf_len+2]=1; | |
79 videobuffer[videobuf_len+3]=next_nal; | |
1 | 80 videobuf_len+=4; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
81 |
1 | 82 // READ PACKET: |
17418 | 83 res = demux_pattern_3(ds, &videobuffer[videobuf_len], |
84 VIDEOBUFFER_SIZE - videobuf_len, &read, 0x100); | |
85 videobuf_len += read; | |
86 if (!res) | |
87 goto eof_out; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
88 |
17418 | 89 videobuf_len-=3; |
1 | 90 |
1973
5216f108cb4f
all error/warn/info messages moved to help_mp-en.h for translation
arpi
parents:
1430
diff
changeset
|
91 mp_dbg(MSGT_PARSEES,MSGL_DBG2,"videobuf: packet 0x1%02X len=%d (total=%d)\n",videobuffer[packet_start+3],videobuf_len-packet_start,videobuf_len); |
1 | 92 |
93 // Save next packet code: | |
17418 | 94 next_nal = demux_getc(ds); |
95 if (next_nal < 0) | |
96 goto eof_out; | |
1 | 97 videobuf_code_len=4; |
98 | |
99 return videobuf_len-packet_start; | |
17418 | 100 |
101 eof_out: | |
102 next_nal = -1; | |
103 videobuf_code_len = 0; | |
104 return videobuf_len - packet_start; | |
1 | 105 } |
106 | |
107 // return: next packet code | |
108 int skip_video_packet(demux_stream_t *ds){ | |
109 | |
110 // SYNC STREAM | |
111 // if(!sync_video_packet(ds)) return 0; // cannot sync (EOF) | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
112 |
1 | 113 videobuf_code_len=0; // force resync |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
114 |
1 | 115 // SYNC AGAIN: |
116 return sync_video_packet(ds); | |
117 } |