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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
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
6ce5ece8e2ea noise bitstream filter
michael
parents: 3421
diff changeset
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
6ce5ece8e2ea noise bitstream filter
michael
parents: 3421
diff changeset
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
6ce5ece8e2ea noise bitstream filter
michael
parents: 3421
diff changeset
56 *poutbuf= (uint8_t *) buf;
6ce5ece8e2ea noise bitstream filter
michael
parents: 3421
diff changeset
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
6ce5ece8e2ea noise bitstream filter
michael
parents: 3421
diff changeset
110 static int noise(AVBitStreamFilterContext *bsfc, AVCodecContext *avctx, const char *args,
6ce5ece8e2ea noise bitstream filter
michael
parents: 3421
diff changeset
111 uint8_t **poutbuf, int *poutbuf_size,
6ce5ece8e2ea noise bitstream filter
michael
parents: 3421
diff changeset
112 const uint8_t *buf, int buf_size, int keyframe){
6ce5ece8e2ea noise bitstream filter
michael
parents: 3421
diff changeset
113 int amount= args ? atoi(args) : 10000;
6ce5ece8e2ea noise bitstream filter
michael
parents: 3421
diff changeset
114 unsigned int *state= bsfc->priv_data;
6ce5ece8e2ea noise bitstream filter
michael
parents: 3421
diff changeset
115 int i;
6ce5ece8e2ea noise bitstream filter
michael
parents: 3421
diff changeset
116
6ce5ece8e2ea noise bitstream filter
michael
parents: 3421
diff changeset
117 *poutbuf= av_malloc(buf_size + FF_INPUT_BUFFER_PADDING_SIZE);
6ce5ece8e2ea noise bitstream filter
michael
parents: 3421
diff changeset
118
6ce5ece8e2ea noise bitstream filter
michael
parents: 3421
diff changeset
119 memcpy(*poutbuf, buf, buf_size + FF_INPUT_BUFFER_PADDING_SIZE);
6ce5ece8e2ea noise bitstream filter
michael
parents: 3421
diff changeset
120 for(i=0; i<buf_size; i++){
6ce5ece8e2ea noise bitstream filter
michael
parents: 3421
diff changeset
121 (*state) += (*poutbuf)[i] + 1;
6ce5ece8e2ea noise bitstream filter
michael
parents: 3421
diff changeset
122 if(*state % amount == 0)
6ce5ece8e2ea noise bitstream filter
michael
parents: 3421
diff changeset
123 (*poutbuf)[i] = *state;
6ce5ece8e2ea noise bitstream filter
michael
parents: 3421
diff changeset
124 }
6ce5ece8e2ea noise bitstream filter
michael
parents: 3421
diff changeset
125 return 1;
6ce5ece8e2ea noise bitstream filter
michael
parents: 3421
diff changeset
126 }
6ce5ece8e2ea noise bitstream filter
michael
parents: 3421
diff changeset
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
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
130 static int mp3_header_compress(AVBitStreamFilterContext *bsfc, AVCodecContext *avctx, const char *args,
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
131 uint8_t **poutbuf, int *poutbuf_size,
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
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
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
135
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
136 if(avctx->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL){
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
137 av_log(avctx, AV_LOG_ERROR, "not standards compliant\n");
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
138 return -1;
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
139 }
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
140
4167
a3134db4857e store a identifer and the first header in extradata
michael
parents: 4166
diff changeset
141 header = BE_32(buf);
4166
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
142 mode_extension= (header>>4)&3;
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
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
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
146 *poutbuf= (uint8_t *) buf;
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
147 *poutbuf_size= buf_size;
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
148
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
149 av_log(avctx, AV_LOG_INFO, "cannot compress %08X\n", header);
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
150 return 0;
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
151 }
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
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
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
172
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
173 if(avctx->channels==2){
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
174 if((header & (3<<19)) != 3<<19){
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
175 (*poutbuf)[1] &= 0x3F;
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
176 (*poutbuf)[1] |= mode_extension<<6;
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
177 FFSWAP(int, (*poutbuf)[1], (*poutbuf)[2]);
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
178 }else{
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
179 (*poutbuf)[1] &= 0x8F;
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
180 (*poutbuf)[1] |= mode_extension<<4;
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
181 }
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
182 }
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
183
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
184 return 1;
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
185 }
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
186
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
187 static int mp3_header_decompress(AVBitStreamFilterContext *bsfc, AVCodecContext *avctx, const char *args,
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
188 uint8_t **poutbuf, int *poutbuf_size,
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
189 const uint8_t *buf, int buf_size, int keyframe){
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
190 uint32_t header;
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
191 int sample_rate= avctx->sample_rate;
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
192 int sample_rate_index=0;
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
193 int lsf, mpeg25, bitrate_index, frame_size;
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
194
4167
a3134db4857e store a identifer and the first header in extradata
michael
parents: 4166
diff changeset
195 header = BE_32(buf);
4166
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
196 if(ff_mpa_check_header(header) >= 0){
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
197 *poutbuf= (uint8_t *) buf;
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
198 *poutbuf_size= buf_size;
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
199
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
200 return 0;
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
201 }
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
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
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
209
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
210 lsf = sample_rate < (24000+32000)/2;
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
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
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
213 sample_rate= mpa_freq_tab[sample_rate_index] >> (lsf + mpeg25); //in case sample rate is a little off
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
214
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
215 for(bitrate_index=2; bitrate_index<30; bitrate_index++){
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
216 frame_size = mpa_bitrate_tab[lsf][2][bitrate_index>>1];
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
217 frame_size = (frame_size * 144000) / (sample_rate << lsf) + (bitrate_index&1);
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
218 if(frame_size == buf_size + 4)
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
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
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
222 }
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
223 if(bitrate_index == 30){
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
224 av_log(avctx, AV_LOG_ERROR, "couldnt find bitrate_index\n");
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
225 return -1;
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
226 }
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
227
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
228 header |= (bitrate_index&1)<<9;
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
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
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
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
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
235
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
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
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
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
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
241 }else{
4167
a3134db4857e store a identifer and the first header in extradata
michael
parents: 4166
diff changeset
242 header |= p[1] & 0x30;
4166
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
243 }
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
244 }
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
245
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
246 (*poutbuf)[0]= header>>24;
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
247 (*poutbuf)[1]= header>>16;
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
248 (*poutbuf)[2]= header>> 8;
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
249 (*poutbuf)[3]= header ;
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
250
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
251 return 1;
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
252 }
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
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
6ce5ece8e2ea noise bitstream filter
michael
parents: 3421
diff changeset
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
6ce5ece8e2ea noise bitstream filter
michael
parents: 3421
diff changeset
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
6ce5ece8e2ea noise bitstream filter
michael
parents: 3421
diff changeset
265
6ce5ece8e2ea noise bitstream filter
michael
parents: 3421
diff changeset
266 AVBitStreamFilter noise_bsf={
6ce5ece8e2ea noise bitstream filter
michael
parents: 3421
diff changeset
267 "noise",
6ce5ece8e2ea noise bitstream filter
michael
parents: 3421
diff changeset
268 sizeof(int),
6ce5ece8e2ea noise bitstream filter
michael
parents: 3421
diff changeset
269 noise,
6ce5ece8e2ea noise bitstream filter
michael
parents: 3421
diff changeset
270 };
4166
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
271
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
272 AVBitStreamFilter mp3_header_compress_bsf={
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
273 "mp3comp",
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
274 0,
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
275 mp3_header_compress,
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
276 };
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
277
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
278 AVBitStreamFilter mp3_header_decompress_bsf={
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
279 "mp3decomp",
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
280 0,
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
281 mp3_header_decompress,
eced83504436 mp3 header (de)compression bitstream filter
michael
parents: 3947
diff changeset
282 };