Mercurial > libavcodec.hg
annotate bitstream_filter.c @ 4167:a3134db4857e libavcodec
store a identifer and the first header in extradata
with this mp3 should be binary identical to what you had before header compression
support mp3 with crc (by droping the crc and putting it back during header decompress, currently its just random tough, does any deocoder even check it?)
author | michael |
---|---|
date | Fri, 10 Nov 2006 11:31:02 +0000 |
parents | eced83504436 |
children | 38bb77e11353 |
rev | line source |
---|---|
3699
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
3422
diff
changeset
|
1 /* |
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
3422
diff
changeset
|
2 * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at> |
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
3422
diff
changeset
|
3 * |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3699
diff
changeset
|
4 * This file is part of FFmpeg. |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3699
diff
changeset
|
5 * |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3699
diff
changeset
|
6 * FFmpeg is free software; you can redistribute it and/or |
3699
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
3422
diff
changeset
|
7 * modify it under the terms of the GNU Lesser General Public |
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
3422
diff
changeset
|
8 * License as published by the Free Software Foundation; either |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3699
diff
changeset
|
9 * version 2.1 of the License, or (at your option) any later version. |
3699
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
3422
diff
changeset
|
10 * |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3699
diff
changeset
|
11 * FFmpeg is distributed in the hope that it will be useful, |
3699
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
3422
diff
changeset
|
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
3422
diff
changeset
|
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
3422
diff
changeset
|
14 * Lesser General Public License for more details. |
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
3422
diff
changeset
|
15 * |
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
3422
diff
changeset
|
16 * You should have received a copy of the GNU Lesser General Public |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3699
diff
changeset
|
17 * License along with FFmpeg; if not, write to the Free Software |
3699
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
3422
diff
changeset
|
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
3422
diff
changeset
|
19 */ |
3421
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
20 |
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
21 #include "avcodec.h" |
4166 | 22 #include "mpegaudio.h" |
3421
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
23 |
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
24 AVBitStreamFilter *first_bitstream_filter= NULL; |
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
25 |
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
26 void av_register_bitstream_filter(AVBitStreamFilter *bsf){ |
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
27 bsf->next = first_bitstream_filter; |
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
28 first_bitstream_filter= bsf; |
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
29 } |
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
30 |
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
31 AVBitStreamFilterContext *av_bitstream_filter_init(const char *name){ |
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
32 AVBitStreamFilter *bsf= first_bitstream_filter; |
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
33 |
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
34 while(bsf){ |
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
35 if(!strcmp(name, bsf->name)){ |
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
36 AVBitStreamFilterContext *bsfc= av_mallocz(sizeof(AVBitStreamFilterContext)); |
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
37 bsfc->filter= bsf; |
3422 | 38 bsfc->priv_data= av_mallocz(bsf->priv_data_size); |
3421
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
39 return bsfc; |
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
40 } |
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
41 bsf= bsf->next; |
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
42 } |
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
43 return NULL; |
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
44 } |
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
45 |
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
46 void av_bitstream_filter_close(AVBitStreamFilterContext *bsfc){ |
3422 | 47 av_freep(&bsfc->priv_data); |
3421
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
48 av_parser_close(bsfc->parser); |
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
49 av_free(bsfc); |
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
50 } |
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
51 |
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
52 int av_bitstream_filter_filter(AVBitStreamFilterContext *bsfc, |
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
53 AVCodecContext *avctx, const char *args, |
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
54 uint8_t **poutbuf, int *poutbuf_size, |
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
55 const uint8_t *buf, int buf_size, int keyframe){ |
3422 | 56 *poutbuf= (uint8_t *) buf; |
57 *poutbuf_size= buf_size; | |
3421
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
58 return bsfc->filter->filter(bsfc, avctx, args, poutbuf, poutbuf_size, buf, buf_size, keyframe); |
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
59 } |
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
60 |
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
61 static int dump_extradata(AVBitStreamFilterContext *bsfc, AVCodecContext *avctx, const char *args, |
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
62 uint8_t **poutbuf, int *poutbuf_size, |
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
63 const uint8_t *buf, int buf_size, int keyframe){ |
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
64 int cmd= args ? *args : 0; |
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
65 /* cast to avoid warning about discarding qualifiers */ |
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
66 if(avctx->extradata){ |
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
67 if( (keyframe && (avctx->flags2 & CODEC_FLAG2_LOCAL_HEADER) && cmd=='a') |
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
68 ||(keyframe && (cmd=='k' || !cmd)) |
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
69 ||(cmd=='e') |
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
70 /*||(? && (s->flags & PARSER_FLAG_DUMP_EXTRADATA_AT_BEGIN)*/){ |
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
71 int size= buf_size + avctx->extradata_size; |
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
72 *poutbuf_size= size; |
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
73 *poutbuf= av_malloc(size + FF_INPUT_BUFFER_PADDING_SIZE); |
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
74 |
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
75 memcpy(*poutbuf, avctx->extradata, avctx->extradata_size); |
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
76 memcpy((*poutbuf) + avctx->extradata_size, buf, buf_size + FF_INPUT_BUFFER_PADDING_SIZE); |
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
77 return 1; |
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
78 } |
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
79 } |
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
80 return 0; |
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
81 } |
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
82 |
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
83 static int remove_extradata(AVBitStreamFilterContext *bsfc, AVCodecContext *avctx, const char *args, |
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
84 uint8_t **poutbuf, int *poutbuf_size, |
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
85 const uint8_t *buf, int buf_size, int keyframe){ |
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
86 int cmd= args ? *args : 0; |
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
87 AVCodecParserContext *s; |
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
88 |
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
89 if(!bsfc->parser){ |
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
90 bsfc->parser= av_parser_init(avctx->codec_id); |
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
91 } |
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
92 s= bsfc->parser; |
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
93 |
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
94 if(s && s->parser->split){ |
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
95 if( (((avctx->flags & CODEC_FLAG_GLOBAL_HEADER) || (avctx->flags2 & CODEC_FLAG2_LOCAL_HEADER)) && cmd=='a') |
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
96 ||(!keyframe && cmd=='k') |
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
97 ||(cmd=='e' || !cmd) |
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
98 ){ |
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
99 int i= s->parser->split(avctx, buf, buf_size); |
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
100 buf += i; |
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
101 buf_size -= i; |
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
102 } |
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
103 } |
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
104 *poutbuf= (uint8_t *) buf; |
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
105 *poutbuf_size= buf_size; |
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
106 |
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
107 return 0; |
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
108 } |
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
109 |
3422 | 110 static int noise(AVBitStreamFilterContext *bsfc, AVCodecContext *avctx, const char *args, |
111 uint8_t **poutbuf, int *poutbuf_size, | |
112 const uint8_t *buf, int buf_size, int keyframe){ | |
113 int amount= args ? atoi(args) : 10000; | |
114 unsigned int *state= bsfc->priv_data; | |
115 int i; | |
116 | |
117 *poutbuf= av_malloc(buf_size + FF_INPUT_BUFFER_PADDING_SIZE); | |
118 | |
119 memcpy(*poutbuf, buf, buf_size + FF_INPUT_BUFFER_PADDING_SIZE); | |
120 for(i=0; i<buf_size; i++){ | |
121 (*state) += (*poutbuf)[i] + 1; | |
122 if(*state % amount == 0) | |
123 (*poutbuf)[i] = *state; | |
124 } | |
125 return 1; | |
126 } | |
127 | |
4167
a3134db4857e
store a identifer and the first header in extradata
michael
parents:
4166
diff
changeset
|
128 #define MP3_MASK 0xFFFE0CCF |
a3134db4857e
store a identifer and the first header in extradata
michael
parents:
4166
diff
changeset
|
129 |
4166 | 130 static int mp3_header_compress(AVBitStreamFilterContext *bsfc, AVCodecContext *avctx, const char *args, |
131 uint8_t **poutbuf, int *poutbuf_size, | |
132 const uint8_t *buf, int buf_size, int keyframe){ | |
4167
a3134db4857e
store a identifer and the first header in extradata
michael
parents:
4166
diff
changeset
|
133 uint32_t header, extraheader; |
a3134db4857e
store a identifer and the first header in extradata
michael
parents:
4166
diff
changeset
|
134 int mode_extension, header_size; |
4166 | 135 |
136 if(avctx->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL){ | |
137 av_log(avctx, AV_LOG_ERROR, "not standards compliant\n"); | |
138 return -1; | |
139 } | |
140 | |
4167
a3134db4857e
store a identifer and the first header in extradata
michael
parents:
4166
diff
changeset
|
141 header = BE_32(buf); |
4166 | 142 mode_extension= (header>>4)&3; |
143 | |
4167
a3134db4857e
store a identifer and the first header in extradata
michael
parents:
4166
diff
changeset
|
144 if(ff_mpa_check_header(header) < 0 || (header&0x60000) != 0x20000){ |
a3134db4857e
store a identifer and the first header in extradata
michael
parents:
4166
diff
changeset
|
145 output_unchanged: |
4166 | 146 *poutbuf= (uint8_t *) buf; |
147 *poutbuf_size= buf_size; | |
148 | |
149 av_log(avctx, AV_LOG_INFO, "cannot compress %08X\n", header); | |
150 return 0; | |
151 } | |
152 | |
4167
a3134db4857e
store a identifer and the first header in extradata
michael
parents:
4166
diff
changeset
|
153 if(avctx->extradata_size == 0){ |
a3134db4857e
store a identifer and the first header in extradata
michael
parents:
4166
diff
changeset
|
154 avctx->extradata_size=15; |
a3134db4857e
store a identifer and the first header in extradata
michael
parents:
4166
diff
changeset
|
155 avctx->extradata= av_malloc(avctx->extradata_size); |
a3134db4857e
store a identifer and the first header in extradata
michael
parents:
4166
diff
changeset
|
156 strcpy(avctx->extradata, "FFCMP3 0.0"); |
a3134db4857e
store a identifer and the first header in extradata
michael
parents:
4166
diff
changeset
|
157 memcpy(avctx->extradata+11, buf, 4); |
a3134db4857e
store a identifer and the first header in extradata
michael
parents:
4166
diff
changeset
|
158 } |
a3134db4857e
store a identifer and the first header in extradata
michael
parents:
4166
diff
changeset
|
159 if(avctx->extradata_size != 15){ |
a3134db4857e
store a identifer and the first header in extradata
michael
parents:
4166
diff
changeset
|
160 av_log(avctx, AV_LOG_ERROR, "Extradata invalid\n"); |
a3134db4857e
store a identifer and the first header in extradata
michael
parents:
4166
diff
changeset
|
161 return -1; |
a3134db4857e
store a identifer and the first header in extradata
michael
parents:
4166
diff
changeset
|
162 } |
a3134db4857e
store a identifer and the first header in extradata
michael
parents:
4166
diff
changeset
|
163 extraheader = BE_32(avctx->extradata+11); |
a3134db4857e
store a identifer and the first header in extradata
michael
parents:
4166
diff
changeset
|
164 if((extraheader&MP3_MASK) != (header&MP3_MASK)) |
a3134db4857e
store a identifer and the first header in extradata
michael
parents:
4166
diff
changeset
|
165 goto output_unchanged; |
a3134db4857e
store a identifer and the first header in extradata
michael
parents:
4166
diff
changeset
|
166 |
a3134db4857e
store a identifer and the first header in extradata
michael
parents:
4166
diff
changeset
|
167 header_size= (header&0x10000) ? 4 : 6; |
a3134db4857e
store a identifer and the first header in extradata
michael
parents:
4166
diff
changeset
|
168 |
a3134db4857e
store a identifer and the first header in extradata
michael
parents:
4166
diff
changeset
|
169 *poutbuf_size= buf_size - header_size; |
a3134db4857e
store a identifer and the first header in extradata
michael
parents:
4166
diff
changeset
|
170 *poutbuf= av_malloc(buf_size - header_size + FF_INPUT_BUFFER_PADDING_SIZE); |
a3134db4857e
store a identifer and the first header in extradata
michael
parents:
4166
diff
changeset
|
171 memcpy(*poutbuf, buf + header_size, buf_size - header_size + FF_INPUT_BUFFER_PADDING_SIZE); |
4166 | 172 |
173 if(avctx->channels==2){ | |
174 if((header & (3<<19)) != 3<<19){ | |
175 (*poutbuf)[1] &= 0x3F; | |
176 (*poutbuf)[1] |= mode_extension<<6; | |
177 FFSWAP(int, (*poutbuf)[1], (*poutbuf)[2]); | |
178 }else{ | |
179 (*poutbuf)[1] &= 0x8F; | |
180 (*poutbuf)[1] |= mode_extension<<4; | |
181 } | |
182 } | |
183 | |
184 return 1; | |
185 } | |
186 | |
187 static int mp3_header_decompress(AVBitStreamFilterContext *bsfc, AVCodecContext *avctx, const char *args, | |
188 uint8_t **poutbuf, int *poutbuf_size, | |
189 const uint8_t *buf, int buf_size, int keyframe){ | |
190 uint32_t header; | |
191 int sample_rate= avctx->sample_rate; | |
192 int sample_rate_index=0; | |
193 int lsf, mpeg25, bitrate_index, frame_size; | |
194 | |
4167
a3134db4857e
store a identifer and the first header in extradata
michael
parents:
4166
diff
changeset
|
195 header = BE_32(buf); |
4166 | 196 if(ff_mpa_check_header(header) >= 0){ |
197 *poutbuf= (uint8_t *) buf; | |
198 *poutbuf_size= buf_size; | |
199 | |
200 return 0; | |
201 } | |
202 | |
4167
a3134db4857e
store a identifer and the first header in extradata
michael
parents:
4166
diff
changeset
|
203 if(avctx->extradata_size != 15 || strcmp(avctx->extradata, "FFCMP3 0.0")){ |
a3134db4857e
store a identifer and the first header in extradata
michael
parents:
4166
diff
changeset
|
204 av_log(avctx, AV_LOG_ERROR, "Extradata invalid %d\n", avctx->extradata_size); |
a3134db4857e
store a identifer and the first header in extradata
michael
parents:
4166
diff
changeset
|
205 return -1; |
a3134db4857e
store a identifer and the first header in extradata
michael
parents:
4166
diff
changeset
|
206 } |
a3134db4857e
store a identifer and the first header in extradata
michael
parents:
4166
diff
changeset
|
207 |
a3134db4857e
store a identifer and the first header in extradata
michael
parents:
4166
diff
changeset
|
208 header= BE_32(avctx->extradata+11) & MP3_MASK; |
4166 | 209 |
210 lsf = sample_rate < (24000+32000)/2; | |
211 mpeg25 = sample_rate < (12000+16000)/2; | |
4167
a3134db4857e
store a identifer and the first header in extradata
michael
parents:
4166
diff
changeset
|
212 sample_rate_index= (header>>10)&3; |
4166 | 213 sample_rate= mpa_freq_tab[sample_rate_index] >> (lsf + mpeg25); //in case sample rate is a little off |
214 | |
215 for(bitrate_index=2; bitrate_index<30; bitrate_index++){ | |
216 frame_size = mpa_bitrate_tab[lsf][2][bitrate_index>>1]; | |
217 frame_size = (frame_size * 144000) / (sample_rate << lsf) + (bitrate_index&1); | |
218 if(frame_size == buf_size + 4) | |
219 break; | |
4167
a3134db4857e
store a identifer and the first header in extradata
michael
parents:
4166
diff
changeset
|
220 if(frame_size == buf_size + 6) |
a3134db4857e
store a identifer and the first header in extradata
michael
parents:
4166
diff
changeset
|
221 break; |
4166 | 222 } |
223 if(bitrate_index == 30){ | |
224 av_log(avctx, AV_LOG_ERROR, "couldnt find bitrate_index\n"); | |
225 return -1; | |
226 } | |
227 | |
228 header |= (bitrate_index&1)<<9; | |
229 header |= (bitrate_index>>1)<<12; | |
4167
a3134db4857e
store a identifer and the first header in extradata
michael
parents:
4166
diff
changeset
|
230 header |= (frame_size == buf_size + 4)<<16; //FIXME actually set a correct crc instead of 0 |
4166 | 231 |
4167
a3134db4857e
store a identifer and the first header in extradata
michael
parents:
4166
diff
changeset
|
232 *poutbuf_size= frame_size; |
a3134db4857e
store a identifer and the first header in extradata
michael
parents:
4166
diff
changeset
|
233 *poutbuf= av_malloc(frame_size + FF_INPUT_BUFFER_PADDING_SIZE); |
a3134db4857e
store a identifer and the first header in extradata
michael
parents:
4166
diff
changeset
|
234 memcpy(*poutbuf + frame_size - buf_size, buf, buf_size + FF_INPUT_BUFFER_PADDING_SIZE); |
4166 | 235 |
236 if(avctx->channels==2){ | |
4167
a3134db4857e
store a identifer and the first header in extradata
michael
parents:
4166
diff
changeset
|
237 uint8_t *p= *poutbuf + frame_size - buf_size; |
4166 | 238 if(lsf){ |
4167
a3134db4857e
store a identifer and the first header in extradata
michael
parents:
4166
diff
changeset
|
239 FFSWAP(int, p[1], p[2]); |
a3134db4857e
store a identifer and the first header in extradata
michael
parents:
4166
diff
changeset
|
240 header |= (p[1] & 0xC0)>>2; |
4166 | 241 }else{ |
4167
a3134db4857e
store a identifer and the first header in extradata
michael
parents:
4166
diff
changeset
|
242 header |= p[1] & 0x30; |
4166 | 243 } |
244 } | |
245 | |
246 (*poutbuf)[0]= header>>24; | |
247 (*poutbuf)[1]= header>>16; | |
248 (*poutbuf)[2]= header>> 8; | |
249 (*poutbuf)[3]= header ; | |
250 | |
251 return 1; | |
252 } | |
253 | |
3421
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
254 AVBitStreamFilter dump_extradata_bsf={ |
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
255 "dump_extra", |
3422 | 256 0, |
3421
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
257 dump_extradata, |
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
258 }; |
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
259 |
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
260 AVBitStreamFilter remove_extradata_bsf={ |
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
261 "remove_extra", |
3422 | 262 0, |
3421
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
263 remove_extradata, |
b7826511f7b6
AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents:
diff
changeset
|
264 }; |
3422 | 265 |
266 AVBitStreamFilter noise_bsf={ | |
267 "noise", | |
268 sizeof(int), | |
269 noise, | |
270 }; | |
4166 | 271 |
272 AVBitStreamFilter mp3_header_compress_bsf={ | |
273 "mp3comp", | |
274 0, | |
275 mp3_header_compress, | |
276 }; | |
277 | |
278 AVBitStreamFilter mp3_header_decompress_bsf={ | |
279 "mp3decomp", | |
280 0, | |
281 mp3_header_decompress, | |
282 }; |