Mercurial > mplayer.hg
annotate libmpdemux/demux_mpc.c @ 24787:02535b3216c5
Avoid text deformation and subtitles moving outside the screen in pan-and-scan
mode.
For this, crop amounts are passed from vo_gl as negative margins sizes. They
are used to calculate aspect ratio. They are ignored when calculating subtitle
positions, so subtitles will stay on screen most of the time.
Based on a patch by Jindrich Makovicka [makovick gmail com].
author | eugeni |
---|---|
date | Fri, 19 Oct 2007 18:16:23 +0000 |
parents | 4d81dbdf46b9 |
children | d4fe6e23283e |
rev | line source |
---|---|
16074
f482bbb5fad9
Allow the ffmpeg people to use this code if they want.
reimar
parents:
15958
diff
changeset
|
1 /** |
f482bbb5fad9
Allow the ffmpeg people to use this code if they want.
reimar
parents:
15958
diff
changeset
|
2 * Demuxer for Musepack v7 bitstream |
22507
a46ab26b2d5e
Source files should not contain non-ASCII characters.
diego
parents:
21507
diff
changeset
|
3 * by Reimar Doeffinger <Reimar.Doeffinger@stud.uni-karlsruhe.de> |
16074
f482bbb5fad9
Allow the ffmpeg people to use this code if they want.
reimar
parents:
15958
diff
changeset
|
4 * This code may be be relicensed under the terms of the GNU LGPL when it |
16093 | 5 * becomes part of the FFmpeg project (ffmpeg.org) |
16074
f482bbb5fad9
Allow the ffmpeg people to use this code if they want.
reimar
parents:
15958
diff
changeset
|
6 */ |
15958
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
7 |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
8 #include "config.h" |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
9 |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
10 #include <stdlib.h> |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
11 #include <stdio.h> |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
12 #include <string.h> |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
13 #include "mp_msg.h" |
21372 | 14 #include "libavutil/common.h" |
21507
fa99b3d31d13
Hack around libavutil/bswap.h compilation problems due to always_inline undefined.
reimar
parents:
21372
diff
changeset
|
15 #include "mpbswap.h" |
22605
4d81dbdf46b9
Add explicit location for headers from the stream/ directory.
diego
parents:
22507
diff
changeset
|
16 #include "stream/stream.h" |
15958
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
17 #include "demuxer.h" |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
18 #include "stheader.h" |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
19 |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
20 |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
21 #define HDR_SIZE (6 * 4) |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
22 |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
23 typedef struct da_priv { |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
24 float last_pts; |
16745 | 25 float pts_per_packet; |
15958
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
26 uint32_t dword; |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
27 int pos; |
16612 | 28 float length; |
15958
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
29 } da_priv_t; |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
30 |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
31 static uint32_t get_bits(da_priv_t* priv, stream_t* s, int bits) { |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
32 uint32_t out = priv->dword; |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
33 uint32_t mask = (1 << bits) - 1; |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
34 priv->pos += bits; |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
35 if (priv->pos < 32) { |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
36 out >>= (32 - priv->pos); |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
37 } |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
38 else { |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
39 stream_read(s, (void *)&priv->dword, 4); |
16149 | 40 priv->dword = le2me_32(priv->dword); |
15958
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
41 priv->pos -= 32; |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
42 if (priv->pos) { |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
43 out <<= priv->pos; |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
44 out |= priv->dword >> (32 - priv->pos); |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
45 } |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
46 } |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
47 return out & mask; |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
48 } |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
49 |
16411
719f5f7094c9
Changes forgotten during demuxer API change, introduce a check function.
reimar
parents:
16175
diff
changeset
|
50 static int demux_mpc_check(demuxer_t* demuxer) { |
15958
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
51 stream_t *s = demuxer->stream; |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
52 uint8_t hdr[HDR_SIZE]; |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
53 int i; |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
54 |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
55 if (stream_read(s, hdr, HDR_SIZE) != HDR_SIZE) |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
56 return 0; |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
57 for (i = 0; i < 30000 && !s->eof; i++) { |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
58 if (hdr[0] == 'M' && hdr[1] == 'P' && hdr[2] == '+') |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
59 break; |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
60 memmove(hdr, &hdr[1], HDR_SIZE - 1); |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
61 stream_read(s, &hdr[HDR_SIZE - 1], 1); |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
62 } |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
63 |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
64 if (hdr[0] != 'M' || hdr[1] != 'P' || hdr[2] != '+') |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
65 return 0; |
16414 | 66 demuxer->movi_start = stream_tell(s) - HDR_SIZE; |
67 demuxer->movi_end = s->end_pos; | |
16411
719f5f7094c9
Changes forgotten during demuxer API change, introduce a check function.
reimar
parents:
16175
diff
changeset
|
68 demuxer->priv = malloc(HDR_SIZE); |
719f5f7094c9
Changes forgotten during demuxer API change, introduce a check function.
reimar
parents:
16175
diff
changeset
|
69 memcpy(demuxer->priv, hdr, HDR_SIZE); |
719f5f7094c9
Changes forgotten during demuxer API change, introduce a check function.
reimar
parents:
16175
diff
changeset
|
70 return DEMUXER_TYPE_MPC; |
719f5f7094c9
Changes forgotten during demuxer API change, introduce a check function.
reimar
parents:
16175
diff
changeset
|
71 } |
719f5f7094c9
Changes forgotten during demuxer API change, introduce a check function.
reimar
parents:
16175
diff
changeset
|
72 |
719f5f7094c9
Changes forgotten during demuxer API change, introduce a check function.
reimar
parents:
16175
diff
changeset
|
73 static demuxer_t *demux_mpc_open(demuxer_t* demuxer) { |
16612 | 74 float seconds = 0; |
16411
719f5f7094c9
Changes forgotten during demuxer API change, introduce a check function.
reimar
parents:
16175
diff
changeset
|
75 stream_t *s = demuxer->stream; |
719f5f7094c9
Changes forgotten during demuxer API change, introduce a check function.
reimar
parents:
16175
diff
changeset
|
76 sh_audio_t* sh_audio; |
719f5f7094c9
Changes forgotten during demuxer API change, introduce a check function.
reimar
parents:
16175
diff
changeset
|
77 da_priv_t* priv = demuxer->priv; |
15958
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
78 |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
79 sh_audio = new_sh_audio(demuxer,0); |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
80 |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
81 { |
18885 | 82 char *wf = calloc(1, sizeof(WAVEFORMATEX) + HDR_SIZE); |
15958
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
83 char *header = &wf[sizeof(WAVEFORMATEX)]; |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
84 const int freqs[4] = {44100, 48000, 37800, 32000}; |
16414 | 85 int frames; |
15958
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
86 sh_audio->format = mmioFOURCC('M', 'P', 'C', ' '); |
16411
719f5f7094c9
Changes forgotten during demuxer API change, introduce a check function.
reimar
parents:
16175
diff
changeset
|
87 memcpy(header, priv, HDR_SIZE); |
719f5f7094c9
Changes forgotten during demuxer API change, introduce a check function.
reimar
parents:
16175
diff
changeset
|
88 free(priv); |
16414 | 89 frames = header[4] | header[5] << 8 | header[6] << 16 | header[7] << 24; |
15958
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
90 sh_audio->wf = (WAVEFORMATEX *)wf; |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
91 sh_audio->wf->wFormatTag = sh_audio->format; |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
92 sh_audio->wf->nChannels = 2; |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
93 sh_audio->wf->nSamplesPerSec = freqs[header[10] & 3]; |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
94 sh_audio->wf->nBlockAlign = 32 * 36; |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
95 sh_audio->wf->wBitsPerSample = 16; |
16612 | 96 seconds = 1152 * frames / (float)sh_audio->wf->nSamplesPerSec; |
97 if (demuxer->movi_end > demuxer->movi_start && seconds > 1) | |
16414 | 98 sh_audio->wf->nAvgBytesPerSec = (demuxer->movi_end - demuxer->movi_start) / seconds; |
99 else | |
100 sh_audio->wf->nAvgBytesPerSec = 32 * 1024; // dummy to make mencoder not hang | |
15958
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
101 sh_audio->wf->cbSize = HDR_SIZE; |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
102 demuxer->movi_start = stream_tell(s); |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
103 demuxer->movi_end = s->end_pos; |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
104 } |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
105 |
18885 | 106 priv = malloc(sizeof(da_priv_t)); |
15958
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
107 priv->last_pts = -1; |
16745 | 108 priv->pts_per_packet = (32 * 36) / (float)sh_audio->wf->nSamplesPerSec; |
16612 | 109 priv->length = seconds; |
15958
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
110 priv->dword = 0; |
16743 | 111 priv->pos = 32; // empty bit buffer |
112 get_bits(priv, s, 8); // discard first 8 bits | |
15958
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
113 demuxer->priv = priv; |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
114 demuxer->audio->id = 0; |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
115 demuxer->audio->sh = sh_audio; |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
116 sh_audio->ds = demuxer->audio; |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
117 sh_audio->samplerate = sh_audio->wf->nSamplesPerSec; |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
118 sh_audio->i_bps = sh_audio->wf->nAvgBytesPerSec; |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
119 sh_audio->audio.dwSampleSize = 0; |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
120 sh_audio->audio.dwScale = 32 * 36; |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
121 sh_audio->audio.dwRate = sh_audio->samplerate; |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
122 |
16411
719f5f7094c9
Changes forgotten during demuxer API change, introduce a check function.
reimar
parents:
16175
diff
changeset
|
123 return demuxer; |
15958
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
124 } |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
125 |
16411
719f5f7094c9
Changes forgotten during demuxer API change, introduce a check function.
reimar
parents:
16175
diff
changeset
|
126 static int demux_mpc_fill_buffer(demuxer_t *demux, demux_stream_t *ds) { |
15958
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
127 int l; |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
128 int bit_len; |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
129 demux_packet_t* dp; |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
130 sh_audio_t* sh_audio = ds->sh; |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
131 da_priv_t* priv = demux->priv; |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
132 stream_t* s = demux->stream; |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
133 sh_audio = ds->sh; |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
134 |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
135 if (s->eof) |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
136 return 0; |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
137 |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
138 bit_len = get_bits(priv, s, 20); |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
139 dp = new_demux_packet((bit_len + 7) / 8); |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
140 for (l = 0; l < (bit_len / 8); l++) |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
141 dp->buffer[l] = get_bits(priv, s, 8); |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
142 bit_len %= 8; |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
143 if (bit_len) |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
144 dp->buffer[l] = get_bits(priv, s, bit_len) << (8 - bit_len); |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
145 if (priv->last_pts < 0) |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
146 priv->last_pts = 0; |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
147 else |
16745 | 148 priv->last_pts += priv->pts_per_packet; |
18710
c528c6c518f1
Clean up audio pts handling, make audio pts tracking in the audio-only
uau
parents:
18707
diff
changeset
|
149 dp->pts = priv->last_pts; |
15958
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
150 ds_add_packet(ds, dp); |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
151 return 1; |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
152 } |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
153 |
17636 | 154 static void demux_mpc_seek(demuxer_t *demuxer,float rel_seek_secs,float audio_delay,int flags){ |
16745 | 155 sh_audio_t* sh_audio = demuxer->audio->sh; |
156 da_priv_t* priv = demuxer->priv; | |
157 stream_t* s = demuxer->stream; | |
158 float target = rel_seek_secs; | |
159 if (flags & 2) | |
160 target *= priv->length; | |
161 if (!(flags & 1)) | |
162 target += priv->last_pts; | |
163 if (target < priv->last_pts) { | |
164 stream_seek(s, demuxer->movi_start); | |
165 priv->pos = 32; // empty bit buffer | |
166 get_bits(priv, s, 8); // discard first 8 bits | |
167 priv->last_pts = 0; | |
168 } | |
169 while (target > priv->last_pts) { | |
170 int bit_len = get_bits(priv, s, 20); | |
171 if (bit_len > 32) { | |
172 stream_skip(s, bit_len / 32 * 4 - 4); | |
173 get_bits(priv, s, 32); // make sure dword is reloaded | |
174 } | |
175 get_bits(priv, s, bit_len % 32); | |
176 priv->last_pts += priv->pts_per_packet; | |
177 if (s->eof) break; | |
178 } | |
179 if (!sh_audio) return; | |
15958
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
180 } |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
181 |
16175 | 182 static void demux_close_mpc(demuxer_t* demuxer) { |
15958
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
183 da_priv_t* priv = demuxer->priv; |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
184 |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
185 if(!priv) |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
186 return; |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
187 free(priv); |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
188 } |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
189 |
16175 | 190 static int demux_mpc_control(demuxer_t *demuxer,int cmd, void *arg){ |
16612 | 191 da_priv_t* priv = demuxer->priv; |
192 switch (cmd) { | |
193 case DEMUXER_CTRL_GET_TIME_LENGTH: | |
194 if (priv->length < 1) return DEMUXER_CTRL_DONTKNOW; | |
195 *((double *)arg) = priv->length; | |
196 return DEMUXER_CTRL_OK; | |
197 case DEMUXER_CTRL_GET_PERCENT_POS: | |
198 if (priv->length < 1) return DEMUXER_CTRL_DONTKNOW; | |
199 *((int *)arg) = priv->last_pts * 100 / priv->length; | |
200 return DEMUXER_CTRL_OK; | |
201 } | |
15958
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
202 return DEMUXER_CTRL_NOTIMPL; |
087142ef3a2d
musepack demuxing and decoding support (demuxing is v7 bitstream only).
reimar
parents:
diff
changeset
|
203 } |
16175 | 204 |
205 | |
206 demuxer_desc_t demuxer_desc_mpc = { | |
207 "Musepack demuxer", | |
208 "mpc", | |
209 "MPC", | |
210 "Reza Jelveh, Reimar Doeffinger", | |
211 "supports v7 bitstream only", | |
212 DEMUXER_TYPE_MPC, | |
213 0, // unsafe autodetect | |
16411
719f5f7094c9
Changes forgotten during demuxer API change, introduce a check function.
reimar
parents:
16175
diff
changeset
|
214 demux_mpc_check, |
16175 | 215 demux_mpc_fill_buffer, |
16411
719f5f7094c9
Changes forgotten during demuxer API change, introduce a check function.
reimar
parents:
16175
diff
changeset
|
216 demux_mpc_open, |
16175 | 217 demux_close_mpc, |
218 demux_mpc_seek, | |
219 demux_mpc_control | |
220 }; |