Mercurial > mplayer.hg
annotate libmpdemux/demux_rawdv.c @ 31246:cc6ee3017097
Limit buffered PTS only when we actually got a frame from the decoder.
This avoids some issues with H.264 PAFF due to dropping PTS values too
early because only every second packet actually produced output.
Just keeping up to one additional pts value would have avoided this
particular issue as well, but this is more generic.
author | reimar |
---|---|
date | Thu, 03 Jun 2010 20:59:40 +0000 |
parents | f1bf918917c6 |
children | cd81fce1f010 |
rev | line source |
---|---|
6925
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
1 /* |
29236
db6cd163b7fb
Replace informal LGPL header by standard LGPL license header.
diego
parents:
26299
diff
changeset
|
2 * raw DV file parser |
db6cd163b7fb
Replace informal LGPL header by standard LGPL license header.
diego
parents:
26299
diff
changeset
|
3 * copyright (c) 2002 Alexander Neundorf <neundorf@kde.org> |
db6cd163b7fb
Replace informal LGPL header by standard LGPL license header.
diego
parents:
26299
diff
changeset
|
4 * based on the fli demuxer |
db6cd163b7fb
Replace informal LGPL header by standard LGPL license header.
diego
parents:
26299
diff
changeset
|
5 * |
db6cd163b7fb
Replace informal LGPL header by standard LGPL license header.
diego
parents:
26299
diff
changeset
|
6 * This file is part of MPlayer. |
db6cd163b7fb
Replace informal LGPL header by standard LGPL license header.
diego
parents:
26299
diff
changeset
|
7 * |
db6cd163b7fb
Replace informal LGPL header by standard LGPL license header.
diego
parents:
26299
diff
changeset
|
8 * MPlayer is free software; you can redistribute it and/or |
db6cd163b7fb
Replace informal LGPL header by standard LGPL license header.
diego
parents:
26299
diff
changeset
|
9 * modify it under the terms of the GNU Lesser General Public |
db6cd163b7fb
Replace informal LGPL header by standard LGPL license header.
diego
parents:
26299
diff
changeset
|
10 * License as published by the Free Software Foundation; either |
db6cd163b7fb
Replace informal LGPL header by standard LGPL license header.
diego
parents:
26299
diff
changeset
|
11 * version 2.1 of the License, or (at your option) any later version. |
db6cd163b7fb
Replace informal LGPL header by standard LGPL license header.
diego
parents:
26299
diff
changeset
|
12 * |
db6cd163b7fb
Replace informal LGPL header by standard LGPL license header.
diego
parents:
26299
diff
changeset
|
13 * MPlayer is distributed in the hope that it will be useful, |
db6cd163b7fb
Replace informal LGPL header by standard LGPL license header.
diego
parents:
26299
diff
changeset
|
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
db6cd163b7fb
Replace informal LGPL header by standard LGPL license header.
diego
parents:
26299
diff
changeset
|
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
db6cd163b7fb
Replace informal LGPL header by standard LGPL license header.
diego
parents:
26299
diff
changeset
|
16 * Lesser General Public License for more details. |
db6cd163b7fb
Replace informal LGPL header by standard LGPL license header.
diego
parents:
26299
diff
changeset
|
17 * |
db6cd163b7fb
Replace informal LGPL header by standard LGPL license header.
diego
parents:
26299
diff
changeset
|
18 * You should have received a copy of the GNU Lesser General Public |
db6cd163b7fb
Replace informal LGPL header by standard LGPL license header.
diego
parents:
26299
diff
changeset
|
19 * License along with MPlayer; if not, write to the Free Software |
db6cd163b7fb
Replace informal LGPL header by standard LGPL license header.
diego
parents:
26299
diff
changeset
|
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
db6cd163b7fb
Replace informal LGPL header by standard LGPL license header.
diego
parents:
26299
diff
changeset
|
21 */ |
6925
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
22 |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
23 #include <stdio.h> |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
24 #include <stdlib.h> |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
25 #include <unistd.h> |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
26 |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
27 #include "config.h" |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
28 |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
29 #include "mp_msg.h" |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
30 #include "help_mp.h" |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
31 |
22605
4d81dbdf46b9
Add explicit location for headers from the stream/ directory.
diego
parents:
20432
diff
changeset
|
32 #include "stream/stream.h" |
6925
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
33 #include "demuxer.h" |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
34 #include "stheader.h" |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
35 |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
36 #include <libdv/dv.h> |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
37 #include <libdv/dv_types.h> |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
38 |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
39 #define DV_PAL_FRAME_SIZE 144000 |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
40 #define DV_NTSC_FRAME_SIZE 122000 |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
41 |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
42 typedef struct |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
43 { |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
44 int current_frame; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
45 int frame_size; |
9630
72870542a127
largefile support by Matthias Schwarzott <zzam@gmx.de>
alex
parents:
9032
diff
changeset
|
46 off_t current_filepos; |
6925
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
47 int frame_number; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
48 dv_decoder_t *decoder; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
49 } rawdv_frames_t; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
50 |
17636 | 51 static void demux_seek_rawdv(demuxer_t *demuxer,float rel_seek_secs,float audio_delay,int flags) |
6925
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
52 { |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
53 rawdv_frames_t *frames = (rawdv_frames_t *)demuxer->priv; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
54 sh_video_t *sh_video = demuxer->video->sh; |
25883
baf32110d3fc
Use defines to give names to the different seek flags.
reimar
parents:
25707
diff
changeset
|
55 off_t newpos=(flags&SEEK_ABSOLUTE)?0:frames->current_frame; |
baf32110d3fc
Use defines to give names to the different seek flags.
reimar
parents:
25707
diff
changeset
|
56 if(flags&SEEK_FACTOR) |
6925
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
57 { |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
58 // float 0..1 |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
59 newpos+=rel_seek_secs*frames->frame_number; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
60 } |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
61 else |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
62 { |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
63 // secs |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
64 newpos+=rel_seek_secs*sh_video->fps; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
65 } |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
66 if(newpos<0) |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
67 newpos=0; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
68 else if(newpos>frames->frame_number) |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
69 newpos=frames->frame_number; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
70 frames->current_frame=newpos; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
71 frames->current_filepos=newpos*frames->frame_size; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
72 } |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
73 |
16175 | 74 static int rawdv_check_file(demuxer_t *demuxer) |
6925
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
75 { |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
76 unsigned char tmp_buffer[DV_PAL_FRAME_SIZE]; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
77 int bytes_read=0; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
78 int result=0; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
79 dv_decoder_t *td; |
7594
a715a0960762
This just corrects a function name to match the other demuxer's
arpi
parents:
6925
diff
changeset
|
80 |
a715a0960762
This just corrects a function name to match the other demuxer's
arpi
parents:
6925
diff
changeset
|
81 mp_msg(MSGT_DEMUX,MSGL_V,"Checking for DV\n"); |
a715a0960762
This just corrects a function name to match the other demuxer's
arpi
parents:
6925
diff
changeset
|
82 |
6925
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
83 bytes_read=stream_read(demuxer->stream,tmp_buffer,DV_PAL_FRAME_SIZE); |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
84 if ((bytes_read!=DV_PAL_FRAME_SIZE) && (bytes_read!=DV_NTSC_FRAME_SIZE)) |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
85 return 0; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
86 |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
87 td=dv_decoder_new(TRUE,TRUE,FALSE); |
8822 | 88 if (!td) |
89 return 0; | |
90 | |
6925
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
91 td->quality=DV_QUALITY_BEST; |
8822 | 92 result=dv_parse_header(td, tmp_buffer); |
9032 | 93 if (result<0) |
8822 | 94 return 0; |
95 | |
6925
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
96 if ((( td->num_dif_seqs==10) || (td->num_dif_seqs==12)) |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
97 && (td->width==720) |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
98 && ((td->height==576) || (td->height==480))) |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
99 result=1; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
100 dv_decoder_free(td); |
16175 | 101 if (result) |
102 return DEMUXER_TYPE_RAWDV; | |
103 else | |
104 return 0; | |
6925
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
105 } |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
106 |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
107 // return value: |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
108 // 0 = EOF or no stream found |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
109 // 1 = successfully read a packet |
16175 | 110 static int demux_rawdv_fill_buffer(demuxer_t *demuxer, demux_stream_t *ds) |
6925
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
111 { |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
112 rawdv_frames_t *frames = (rawdv_frames_t *)demuxer->priv; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
113 demux_packet_t* dp_video=NULL; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
114 sh_video_t *sh_video = demuxer->video->sh; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
115 int bytes_read=0; |
9630
72870542a127
largefile support by Matthias Schwarzott <zzam@gmx.de>
alex
parents:
9032
diff
changeset
|
116 // fprintf(stderr,"demux_rawdv_fill_buffer() seek to %qu, size: %d\n",frames->current_filepos,frames->frame_size); |
6925
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
117 // fetch the frame from the file |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
118 // first, position the file properly since ds_read_packet() doesn't |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
119 // seem to do it, even though it takes a file offset as a parameter |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
120 stream_seek(demuxer->stream, frames->current_filepos); |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
121 |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
122 dp_video=new_demux_packet(frames->frame_size); |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
123 bytes_read=stream_read(demuxer->stream,dp_video->buffer,frames->frame_size); |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
124 if (bytes_read<frames->frame_size) |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
125 return 0; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
126 dp_video->pts=frames->current_frame/sh_video->fps; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
127 dp_video->pos=frames->current_filepos; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
128 dp_video->flags=0; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
129 |
7673 | 130 if (demuxer->audio && demuxer->audio->id>=-1) |
131 { | |
6925
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
132 demux_packet_t* dp_audio=clone_demux_packet(dp_video); |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
133 ds_add_packet(demuxer->audio,dp_audio); |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
134 } |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
135 ds_add_packet(demuxer->video,dp_video); |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
136 // get the next frame ready |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
137 frames->current_filepos+=frames->frame_size; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
138 frames->current_frame++; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
139 // fprintf(stderr," audio->packs: %d , video->packs: %d \n",demuxer->audio->packs, demuxer->video->packs); |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
140 return 1; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
141 } |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
142 |
16175 | 143 static demuxer_t* demux_open_rawdv(demuxer_t* demuxer) |
6925
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
144 { |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
145 unsigned char dv_frame[DV_PAL_FRAME_SIZE]; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
146 sh_video_t *sh_video = NULL; |
19062
83c3afeab35d
drops casts from void * on malloc/calloc from libmpdemux code
reynaldo
parents:
18922
diff
changeset
|
147 rawdv_frames_t *frames = malloc(sizeof(rawdv_frames_t)); |
6925
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
148 dv_decoder_t *dv_decoder=NULL; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
149 |
17366 | 150 mp_msg(MSGT_DEMUXER,MSGL_V,"demux_open_rawdv() end_pos %"PRId64"\n",(int64_t)demuxer->stream->end_pos); |
6925
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
151 |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
152 // go back to the beginning |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
153 stream_reset(demuxer->stream); |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
154 stream_seek(demuxer->stream, 0); |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
155 |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
156 //get the first frame |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
157 stream_read(demuxer->stream, dv_frame, DV_PAL_FRAME_SIZE); |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
158 |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
159 //read params from this frame |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
160 dv_decoder=dv_decoder_new(TRUE,TRUE,FALSE); |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
161 dv_decoder->quality=DV_QUALITY_BEST; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
162 |
20432
972c93990379
add two missing checks - PATCH by Karolina Lindqvist AT kramnet-se
reynaldo
parents:
19062
diff
changeset
|
163 if (dv_parse_header(dv_decoder, dv_frame) == -1) |
972c93990379
add two missing checks - PATCH by Karolina Lindqvist AT kramnet-se
reynaldo
parents:
19062
diff
changeset
|
164 return NULL; |
6925
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
165 |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
166 // create a new video stream header |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
167 sh_video = new_sh_video(demuxer, 0); |
20432
972c93990379
add two missing checks - PATCH by Karolina Lindqvist AT kramnet-se
reynaldo
parents:
19062
diff
changeset
|
168 if (!sh_video) |
972c93990379
add two missing checks - PATCH by Karolina Lindqvist AT kramnet-se
reynaldo
parents:
19062
diff
changeset
|
169 return NULL; |
6925
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
170 |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
171 // make sure the demuxer knows about the new video stream header |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
172 // (even though new_sh_video() ought to take care of it) |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
173 demuxer->seekable = 1; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
174 demuxer->video->sh = sh_video; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
175 |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
176 // make sure that the video demuxer stream header knows about its |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
177 // parent video demuxer stream (this is getting wacky), or else |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
178 // video_read_properties() will choke |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
179 sh_video->ds = demuxer->video; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
180 |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
181 // custom fourcc for internal MPlayer use |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
182 // sh_video->format = mmioFOURCC('R', 'A', 'D', 'V'); |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
183 sh_video->format = mmioFOURCC('D', 'V', 'S', 'D'); |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
184 |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
185 sh_video->disp_w = dv_decoder->width; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
186 sh_video->disp_h = dv_decoder->height; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
187 mp_msg(MSGT_DEMUXER,MSGL_V,"demux_open_rawdv() frame_size: %d w: %d h: %d dif_seq: %d system: %d\n",dv_decoder->frame_size,dv_decoder->width, dv_decoder->height,dv_decoder->num_dif_seqs,dv_decoder->system); |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
188 |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
189 sh_video->fps= (dv_decoder->system==e_dv_system_525_60?29.97:25); |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
190 sh_video->frametime = 1.0/sh_video->fps; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
191 |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
192 // emulate BITMAPINFOHEADER for win32 decoders: |
29897 | 193 sh_video->bih=calloc(1, sizeof(BITMAPINFOHEADER)); |
6925
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
194 sh_video->bih->biSize=40; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
195 sh_video->bih->biWidth = dv_decoder->width; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
196 sh_video->bih->biHeight = dv_decoder->height; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
197 sh_video->bih->biPlanes=1; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
198 sh_video->bih->biBitCount=24; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
199 sh_video->bih->biCompression=sh_video->format; // "DVSD" |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
200 sh_video->bih->biSizeImage=sh_video->bih->biWidth*sh_video->bih->biHeight*3; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
201 |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
202 |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
203 frames->current_filepos=0; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
204 frames->current_frame=0; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
205 frames->frame_size=dv_decoder->frame_size; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
206 frames->frame_number=demuxer->stream->end_pos/frames->frame_size; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
207 |
9630
72870542a127
largefile support by Matthias Schwarzott <zzam@gmx.de>
alex
parents:
9032
diff
changeset
|
208 mp_msg(MSGT_DEMUXER,MSGL_V,"demux_open_rawdv() seek to %qu, size: %d, dv_dec->frame_size: %d\n",frames->current_filepos,frames->frame_size, dv_decoder->frame_size); |
7673 | 209 if (dv_decoder->audio != NULL && demuxer->audio->id>=-1){ |
6925
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
210 sh_audio_t *sh_audio = new_sh_audio(demuxer, 0); |
26299
4d56038ec730
Fix lots and lots of other demuxers broken by r26301
reimar
parents:
25883
diff
changeset
|
211 demuxer->audio->id = 0; |
6925
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
212 demuxer->audio->sh = sh_audio; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
213 sh_audio->ds = demuxer->audio; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
214 mp_msg(MSGT_DEMUXER,MSGL_V,"demux_open_rawdv() chan: %d samplerate: %d\n",dv_decoder->audio->num_channels,dv_decoder->audio->frequency ); |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
215 // custom fourcc for internal MPlayer use |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
216 sh_audio->format = mmioFOURCC('R', 'A', 'D', 'V'); |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
217 |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
218 sh_audio->wf = malloc(sizeof(WAVEFORMATEX)); |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
219 memset(sh_audio->wf, 0, sizeof(WAVEFORMATEX)); |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
220 sh_audio->wf->wFormatTag = sh_audio->format; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
221 sh_audio->wf->nChannels = dv_decoder->audio->num_channels; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
222 sh_audio->wf->wBitsPerSample = 16; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
223 sh_audio->wf->nSamplesPerSec = dv_decoder->audio->frequency; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
224 // info about the input stream: |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
225 sh_audio->wf->nAvgBytesPerSec = sh_video->fps*dv_decoder->frame_size; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
226 sh_audio->wf->nBlockAlign = dv_decoder->frame_size; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
227 |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
228 // sh_audio->context=(void*)dv_decoder; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
229 } |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
230 stream_reset(demuxer->stream); |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
231 stream_seek(demuxer->stream, 0); |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
232 dv_decoder_free(dv_decoder); //we keep this in the context of both stream headers |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
233 demuxer->priv=frames; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
234 return demuxer; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
235 } |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
236 |
16175 | 237 static void demux_close_rawdv(demuxer_t* demuxer) |
6925
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
238 { |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
239 rawdv_frames_t *frames = (rawdv_frames_t *)demuxer->priv; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
240 |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
241 if(frames==0) |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
242 return; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
243 free(frames); |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
244 } |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
245 |
16175 | 246 static int demux_rawdv_control(demuxer_t *demuxer,int cmd, void *arg) { |
14934
89031188b7b2
Rather simple patch for RAWDV demuxer which lets it say whats the total
rtognimp
parents:
10539
diff
changeset
|
247 rawdv_frames_t *frames = (rawdv_frames_t *)demuxer->priv; |
89031188b7b2
Rather simple patch for RAWDV demuxer which lets it say whats the total
rtognimp
parents:
10539
diff
changeset
|
248 sh_video_t *sh_video=demuxer->video->sh; |
89031188b7b2
Rather simple patch for RAWDV demuxer which lets it say whats the total
rtognimp
parents:
10539
diff
changeset
|
249 |
89031188b7b2
Rather simple patch for RAWDV demuxer which lets it say whats the total
rtognimp
parents:
10539
diff
changeset
|
250 switch(cmd) { |
89031188b7b2
Rather simple patch for RAWDV demuxer which lets it say whats the total
rtognimp
parents:
10539
diff
changeset
|
251 case DEMUXER_CTRL_GET_TIME_LENGTH: |
16346
6ff303d2876b
Make -identify's 'ID_LENGTH=' print a float and not an integer.. The
ods15
parents:
16175
diff
changeset
|
252 *((double *)arg)=(double)frames->frame_number / sh_video->fps; |
14934
89031188b7b2
Rather simple patch for RAWDV demuxer which lets it say whats the total
rtognimp
parents:
10539
diff
changeset
|
253 return DEMUXER_CTRL_OK; |
89031188b7b2
Rather simple patch for RAWDV demuxer which lets it say whats the total
rtognimp
parents:
10539
diff
changeset
|
254 |
89031188b7b2
Rather simple patch for RAWDV demuxer which lets it say whats the total
rtognimp
parents:
10539
diff
changeset
|
255 case DEMUXER_CTRL_GET_PERCENT_POS: |
89031188b7b2
Rather simple patch for RAWDV demuxer which lets it say whats the total
rtognimp
parents:
10539
diff
changeset
|
256 *((int *)arg)=(int)(frames->current_frame * 100. / frames->frame_number); |
89031188b7b2
Rather simple patch for RAWDV demuxer which lets it say whats the total
rtognimp
parents:
10539
diff
changeset
|
257 return DEMUXER_CTRL_OK; |
89031188b7b2
Rather simple patch for RAWDV demuxer which lets it say whats the total
rtognimp
parents:
10539
diff
changeset
|
258 |
89031188b7b2
Rather simple patch for RAWDV demuxer which lets it say whats the total
rtognimp
parents:
10539
diff
changeset
|
259 default: |
89031188b7b2
Rather simple patch for RAWDV demuxer which lets it say whats the total
rtognimp
parents:
10539
diff
changeset
|
260 return DEMUXER_CTRL_NOTIMPL; |
89031188b7b2
Rather simple patch for RAWDV demuxer which lets it say whats the total
rtognimp
parents:
10539
diff
changeset
|
261 } |
89031188b7b2
Rather simple patch for RAWDV demuxer which lets it say whats the total
rtognimp
parents:
10539
diff
changeset
|
262 } |
89031188b7b2
Rather simple patch for RAWDV demuxer which lets it say whats the total
rtognimp
parents:
10539
diff
changeset
|
263 |
16175 | 264 |
25707
d4fe6e23283e
Make all demuxer_desc_t const, thus moving them to .rodata
reimar
parents:
22605
diff
changeset
|
265 const demuxer_desc_t demuxer_desc_rawdv = { |
16175 | 266 "Raw DV demuxer", |
267 "rawdv", | |
268 "RAWDV", | |
269 "Alexander Neundorf", | |
270 "", | |
271 DEMUXER_TYPE_RAWDV, | |
272 0, // unsafe autodetect | |
273 rawdv_check_file, | |
274 demux_rawdv_fill_buffer, | |
275 demux_open_rawdv, | |
276 demux_close_rawdv, | |
277 demux_seek_rawdv, | |
278 demux_rawdv_control | |
279 }; |