Browse code

Merge remote-tracking branch 'qatar/master'

* qatar/master:
x86: dsputil: Only compile motion_est code when encoders are enabled
mem: fix typo in check for __ICC
fate: mp3: drop redundant CMP setting
rtp: Depacketization of JPEG (RFC 2435)
Rename ff_put_string to avpriv_put_string
mjpeg: Rename some symbols to avpriv_* instead of ff_*
yadif: cosmetics

Conflicts:
Changelog
libavcodec/mjpegenc.c
libavcodec/x86/Makefile
libavfilter/vf_yadif.c
libavformat/version.h
libavutil/mem.h

Merged-by: Michael Niedermayer <michaelni@gmx.at>

Michael Niedermayer authored on 2012/09/10 21:05:42
Showing 18 changed files
... ...
@@ -59,6 +59,7 @@ version next:
59 59
 - smartblur filter ported from MPlayer
60 60
 - CPiA decoder
61 61
 - decimate filter ported from MPlayer
62
+- RTP depacketization of JPEG
62 63
 
63 64
 
64 65
 version 0.11:
... ...
@@ -628,6 +628,7 @@ OBJS-$(CONFIG_OGG_DEMUXER)             += xiph.o flac.o flacdata.o     \
628 628
 OBJS-$(CONFIG_OGG_MUXER)               += xiph.o flac.o flacdata.o \
629 629
                                           vorbis_data.o
630 630
 OBJS-$(CONFIG_RTP_MUXER)               += mpeg4audio.o xiph.o
631
+OBJS-$(CONFIG_RTPDEC)                  += mjpeg.o
631 632
 OBJS-$(CONFIG_SPDIF_DEMUXER)           += aacadtsdec.o mpeg4audio.o
632 633
 OBJS-$(CONFIG_SPDIF_MUXER)             += dca.o
633 634
 OBJS-$(CONFIG_WEBM_MUXER)              += mpeg4audio.o mpegaudiodata.o  \
... ...
@@ -47,7 +47,7 @@ void avpriv_align_put_bits(PutBitContext *s)
47 47
     put_bits(s,s->bit_left & 7,0);
48 48
 }
49 49
 
50
-void ff_put_string(PutBitContext *pb, const char *string, int terminate_string)
50
+void avpriv_put_string(PutBitContext *pb, const char *string, int terminate_string)
51 51
 {
52 52
     while(*string){
53 53
         put_bits(pb, 8, *string);
... ...
@@ -62,17 +62,17 @@ const unsigned char std_chrominance_quant_tbl[64] = {
62 62
 
63 63
 /* Set up the standard Huffman tables (cf. JPEG standard section K.3) */
64 64
 /* IMPORTANT: these are only valid for 8-bit data precision! */
65
-const uint8_t ff_mjpeg_bits_dc_luminance[17] =
65
+const uint8_t avpriv_mjpeg_bits_dc_luminance[17] =
66 66
 { /* 0-base */ 0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 };
67
-const uint8_t ff_mjpeg_val_dc[12] =
67
+const uint8_t avpriv_mjpeg_val_dc[12] =
68 68
 { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
69 69
 
70
-const uint8_t ff_mjpeg_bits_dc_chrominance[17] =
70
+const uint8_t avpriv_mjpeg_bits_dc_chrominance[17] =
71 71
 { /* 0-base */ 0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 };
72 72
 
73
-const uint8_t ff_mjpeg_bits_ac_luminance[17] =
73
+const uint8_t avpriv_mjpeg_bits_ac_luminance[17] =
74 74
 { /* 0-base */ 0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d };
75
-const uint8_t ff_mjpeg_val_ac_luminance[] =
75
+const uint8_t avpriv_mjpeg_val_ac_luminance[] =
76 76
 { 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12,
77 77
   0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07,
78 78
   0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08,
... ...
@@ -96,10 +96,10 @@ const uint8_t ff_mjpeg_val_ac_luminance[] =
96 96
   0xf9, 0xfa
97 97
 };
98 98
 
99
-const uint8_t ff_mjpeg_bits_ac_chrominance[17] =
99
+const uint8_t avpriv_mjpeg_bits_ac_chrominance[17] =
100 100
 { /* 0-base */ 0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77 };
101 101
 
102
-const uint8_t ff_mjpeg_val_ac_chrominance[] =
102
+const uint8_t avpriv_mjpeg_val_ac_chrominance[] =
103 103
 { 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21,
104 104
   0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71,
105 105
   0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91,
... ...
@@ -138,16 +138,16 @@ static inline void put_marker(PutBitContext *p, int code)
138 138
         case 7: ret= (left + top)>>1; break;\
139 139
     }
140 140
 
141
-extern const uint8_t ff_mjpeg_bits_dc_luminance[];
142
-extern const uint8_t ff_mjpeg_val_dc[];
141
+extern const uint8_t avpriv_mjpeg_bits_dc_luminance[];
142
+extern const uint8_t avpriv_mjpeg_val_dc[];
143 143
 
144
-extern const uint8_t ff_mjpeg_bits_dc_chrominance[];
144
+extern const uint8_t avpriv_mjpeg_bits_dc_chrominance[];
145 145
 
146
-extern const uint8_t ff_mjpeg_bits_ac_luminance[];
147
-extern const uint8_t ff_mjpeg_val_ac_luminance[];
146
+extern const uint8_t avpriv_mjpeg_bits_ac_luminance[];
147
+extern const uint8_t avpriv_mjpeg_val_ac_luminance[];
148 148
 
149
-extern const uint8_t ff_mjpeg_bits_ac_chrominance[];
150
-extern const uint8_t ff_mjpeg_val_ac_chrominance[];
149
+extern const uint8_t avpriv_mjpeg_bits_ac_chrominance[];
150
+extern const uint8_t avpriv_mjpeg_val_ac_chrominance[];
151 151
 
152 152
 void ff_mjpeg_build_huffman_codes(uint8_t *huff_size, uint16_t *huff_code,
153 153
                                   const uint8_t *bits_table,
... ...
@@ -59,15 +59,15 @@ static uint8_t *append(uint8_t *buf, const uint8_t *src, int size)
59 59
 static uint8_t *append_dht_segment(uint8_t *buf)
60 60
 {
61 61
     buf = append(buf, dht_segment_head, sizeof(dht_segment_head));
62
-    buf = append(buf, ff_mjpeg_bits_dc_luminance + 1, 16);
62
+    buf = append(buf, avpriv_mjpeg_bits_dc_luminance + 1, 16);
63 63
     buf = append(buf, dht_segment_frag, sizeof(dht_segment_frag));
64
-    buf = append(buf, ff_mjpeg_val_dc, 12);
64
+    buf = append(buf, avpriv_mjpeg_val_dc, 12);
65 65
     *(buf++) = 0x10;
66
-    buf = append(buf, ff_mjpeg_bits_ac_luminance + 1, 16);
67
-    buf = append(buf, ff_mjpeg_val_ac_luminance, 162);
66
+    buf = append(buf, avpriv_mjpeg_bits_ac_luminance + 1, 16);
67
+    buf = append(buf, avpriv_mjpeg_val_ac_luminance, 162);
68 68
     *(buf++) = 0x11;
69
-    buf = append(buf, ff_mjpeg_bits_ac_chrominance + 1, 16);
70
-    buf = append(buf, ff_mjpeg_val_ac_chrominance, 162);
69
+    buf = append(buf, avpriv_mjpeg_bits_ac_chrominance + 1, 16);
70
+    buf = append(buf, avpriv_mjpeg_val_ac_chrominance, 162);
71 71
     return buf;
72 72
 }
73 73
 
... ...
@@ -65,18 +65,18 @@ static int build_vlc(VLC *vlc, const uint8_t *bits_table,
65 65
 
66 66
 static void build_basic_mjpeg_vlc(MJpegDecodeContext *s)
67 67
 {
68
-    build_vlc(&s->vlcs[0][0], ff_mjpeg_bits_dc_luminance,
69
-              ff_mjpeg_val_dc, 12, 0, 0);
70
-    build_vlc(&s->vlcs[0][1], ff_mjpeg_bits_dc_chrominance,
71
-              ff_mjpeg_val_dc, 12, 0, 0);
72
-    build_vlc(&s->vlcs[1][0], ff_mjpeg_bits_ac_luminance,
73
-              ff_mjpeg_val_ac_luminance, 251, 0, 1);
74
-    build_vlc(&s->vlcs[1][1], ff_mjpeg_bits_ac_chrominance,
75
-              ff_mjpeg_val_ac_chrominance, 251, 0, 1);
76
-    build_vlc(&s->vlcs[2][0], ff_mjpeg_bits_ac_luminance,
77
-              ff_mjpeg_val_ac_luminance, 251, 0, 0);
78
-    build_vlc(&s->vlcs[2][1], ff_mjpeg_bits_ac_chrominance,
79
-              ff_mjpeg_val_ac_chrominance, 251, 0, 0);
68
+    build_vlc(&s->vlcs[0][0], avpriv_mjpeg_bits_dc_luminance,
69
+              avpriv_mjpeg_val_dc, 12, 0, 0);
70
+    build_vlc(&s->vlcs[0][1], avpriv_mjpeg_bits_dc_chrominance,
71
+              avpriv_mjpeg_val_dc, 12, 0, 0);
72
+    build_vlc(&s->vlcs[1][0], avpriv_mjpeg_bits_ac_luminance,
73
+              avpriv_mjpeg_val_ac_luminance, 251, 0, 1);
74
+    build_vlc(&s->vlcs[1][1], avpriv_mjpeg_bits_ac_chrominance,
75
+              avpriv_mjpeg_val_ac_chrominance, 251, 0, 1);
76
+    build_vlc(&s->vlcs[2][0], avpriv_mjpeg_bits_ac_luminance,
77
+              avpriv_mjpeg_val_ac_luminance, 251, 0, 0);
78
+    build_vlc(&s->vlcs[2][1], avpriv_mjpeg_bits_ac_chrominance,
79
+              avpriv_mjpeg_val_ac_chrominance, 251, 0, 0);
80 80
 }
81 81
 
82 82
 av_cold int ff_mjpeg_decode_init(AVCodecContext *avctx)
... ...
@@ -60,20 +60,20 @@ av_cold int ff_mjpeg_encode_init(MpegEncContext *s)
60 60
     /* build all the huffman tables */
61 61
     ff_mjpeg_build_huffman_codes(m->huff_size_dc_luminance,
62 62
                                  m->huff_code_dc_luminance,
63
-                                 ff_mjpeg_bits_dc_luminance,
64
-                                 ff_mjpeg_val_dc);
63
+                                 avpriv_mjpeg_bits_dc_luminance,
64
+                                 avpriv_mjpeg_val_dc);
65 65
     ff_mjpeg_build_huffman_codes(m->huff_size_dc_chrominance,
66 66
                                  m->huff_code_dc_chrominance,
67
-                                 ff_mjpeg_bits_dc_chrominance,
68
-                                 ff_mjpeg_val_dc);
67
+                                 avpriv_mjpeg_bits_dc_chrominance,
68
+                                 avpriv_mjpeg_val_dc);
69 69
     ff_mjpeg_build_huffman_codes(m->huff_size_ac_luminance,
70 70
                                  m->huff_code_ac_luminance,
71
-                                 ff_mjpeg_bits_ac_luminance,
72
-                                 ff_mjpeg_val_ac_luminance);
71
+                                 avpriv_mjpeg_bits_ac_luminance,
72
+                                 avpriv_mjpeg_val_ac_luminance);
73 73
     ff_mjpeg_build_huffman_codes(m->huff_size_ac_chrominance,
74 74
                                  m->huff_code_ac_chrominance,
75
-                                 ff_mjpeg_bits_ac_chrominance,
76
-                                 ff_mjpeg_val_ac_chrominance);
75
+                                 avpriv_mjpeg_bits_ac_chrominance,
76
+                                 avpriv_mjpeg_val_ac_chrominance);
77 77
 
78 78
     s->mjpeg_ctx = m;
79 79
     return 0;
... ...
@@ -146,15 +146,15 @@ static void jpeg_table_header(MpegEncContext *s)
146 146
     ptr = put_bits_ptr(p);
147 147
     put_bits(p, 16, 0); /* patched later */
148 148
     size = 2;
149
-    size += put_huffman_table(s, 0, 0, ff_mjpeg_bits_dc_luminance,
150
-                              ff_mjpeg_val_dc);
151
-    size += put_huffman_table(s, 0, 1, ff_mjpeg_bits_dc_chrominance,
152
-                              ff_mjpeg_val_dc);
153
-
154
-    size += put_huffman_table(s, 1, 0, ff_mjpeg_bits_ac_luminance,
155
-                              ff_mjpeg_val_ac_luminance);
156
-    size += put_huffman_table(s, 1, 1, ff_mjpeg_bits_ac_chrominance,
157
-                              ff_mjpeg_val_ac_chrominance);
149
+    size += put_huffman_table(s, 0, 0, avpriv_mjpeg_bits_dc_luminance,
150
+                              avpriv_mjpeg_val_dc);
151
+    size += put_huffman_table(s, 0, 1, avpriv_mjpeg_bits_dc_chrominance,
152
+                              avpriv_mjpeg_val_dc);
153
+
154
+    size += put_huffman_table(s, 1, 0, avpriv_mjpeg_bits_ac_luminance,
155
+                              avpriv_mjpeg_val_ac_luminance);
156
+    size += put_huffman_table(s, 1, 1, avpriv_mjpeg_bits_ac_chrominance,
157
+                              avpriv_mjpeg_val_ac_chrominance);
158 158
     AV_WB16(ptr, size);
159 159
 }
160 160
 
... ...
@@ -169,7 +169,7 @@ static void jpeg_put_comments(MpegEncContext *s)
169 169
     /* JFIF header */
170 170
     put_marker(p, APP0);
171 171
     put_bits(p, 16, 16);
172
-    ff_put_string(p, "JFIF", 1); /* this puts the trailing zero-byte too */
172
+    avpriv_put_string(p, "JFIF", 1); /* this puts the trailing zero-byte too */
173 173
     put_bits(p, 16, 0x0102); /* v 1.02 */
174 174
     put_bits(p, 8, 0); /* units type: 0 - aspect ratio */
175 175
     put_bits(p, 16, s->avctx->sample_aspect_ratio.num);
... ...
@@ -184,7 +184,7 @@ static void jpeg_put_comments(MpegEncContext *s)
184 184
         flush_put_bits(p);
185 185
         ptr = put_bits_ptr(p);
186 186
         put_bits(p, 16, 0); /* patched later */
187
-        ff_put_string(p, LIBAVCODEC_IDENT, 1);
187
+        avpriv_put_string(p, LIBAVCODEC_IDENT, 1);
188 188
         size = strlen(LIBAVCODEC_IDENT)+3;
189 189
         AV_WB16(ptr, size);
190 190
     }
... ...
@@ -196,7 +196,7 @@ static void jpeg_put_comments(MpegEncContext *s)
196 196
         flush_put_bits(p);
197 197
         ptr = put_bits_ptr(p);
198 198
         put_bits(p, 16, 0); /* patched later */
199
-        ff_put_string(p, "CS=ITU601", 1);
199
+        avpriv_put_string(p, "CS=ITU601", 1);
200 200
         size = strlen("CS=ITU601")+3;
201 201
         AV_WB16(ptr, size);
202 202
     }
... ...
@@ -1035,7 +1035,7 @@ static void mpeg4_encode_vol_header(MpegEncContext * s, int vo_number, int vol_n
1035 1035
     if(!(s->flags & CODEC_FLAG_BITEXACT)){
1036 1036
         put_bits(&s->pb, 16, 0);
1037 1037
         put_bits(&s->pb, 16, 0x1B2);    /* user_data */
1038
-        ff_put_string(&s->pb, LIBAVCODEC_IDENT, 0);
1038
+        avpriv_put_string(&s->pb, LIBAVCODEC_IDENT, 0);
1039 1039
     }
1040 1040
 }
1041 1041
 
... ...
@@ -99,7 +99,7 @@ static inline void flush_put_bits(PutBitContext *s)
99 99
 
100 100
 #ifdef BITSTREAM_WRITER_LE
101 101
 #define avpriv_align_put_bits align_put_bits_unsupported_here
102
-#define ff_put_string ff_put_string_unsupported_here
102
+#define avpriv_put_string ff_put_string_unsupported_here
103 103
 #define avpriv_copy_bits avpriv_copy_bits_unsupported_here
104 104
 #else
105 105
 /**
... ...
@@ -112,7 +112,7 @@ void avpriv_align_put_bits(PutBitContext *s);
112 112
  *
113 113
  * @param terminate_string 0-terminates the written string if value is 1
114 114
  */
115
-void ff_put_string(PutBitContext *pb, const char *string, int terminate_string);
115
+void avpriv_put_string(PutBitContext *pb, const char *string, int terminate_string);
116 116
 
117 117
 /**
118 118
  * Copy the content of src to the bitstream.
... ...
@@ -11,7 +11,6 @@ MMX-OBJS                               += x86/dsputil_mmx.o             \
11 11
                                           x86/fmtconvert_init.o         \
12 12
                                           x86/idct_mmx_xvid.o           \
13 13
                                           x86/idct_sse2_xvid.o          \
14
-                                          x86/motion_est.o              \
15 14
                                           x86/simple_idct.o             \
16 15
 
17 16
 MMX-OBJS-$(CONFIG_AAC_DECODER)         += x86/sbrdsp_init.o
... ...
@@ -19,7 +18,8 @@ MMX-OBJS-$(CONFIG_AC3DSP)              += x86/ac3dsp_init.o
19 19
 MMX-OBJS-$(CONFIG_CAVS_DECODER)        += x86/cavsdsp.o
20 20
 MMX-OBJS-$(CONFIG_DWT)                 += x86/snowdsp.o \
21 21
                                           x86/dwt.o
22
-MMX-OBJS-$(CONFIG_ENCODERS)            += x86/dsputilenc_mmx.o
22
+MMX-OBJS-$(CONFIG_ENCODERS)            += x86/dsputilenc_mmx.o          \
23
+                                          x86/motion_est.o
23 24
 MMX-OBJS-$(CONFIG_FFT)                 += x86/fft_init.o
24 25
 MMX-OBJS-$(CONFIG_GPL)                 += x86/idct_mmx.o
25 26
 MMX-OBJS-$(CONFIG_H264DSP)             += x86/h264dsp_init.o
... ...
@@ -30,6 +30,8 @@
30 30
 #undef NDEBUG
31 31
 #include <assert.h>
32 32
 
33
+#define PERM_RWP AV_PERM_WRITE | AV_PERM_PRESERVE | AV_PERM_REUSE
34
+
33 35
 #define CHECK(j)\
34 36
     {   int score = FFABS(cur[mrefs-1+(j)] - cur[prefs-1-(j)])\
35 37
                   + FFABS(cur[mrefs  +(j)] - cur[prefs  -(j)])\
... ...
@@ -46,19 +48,19 @@
46 46
         int temporal_diff0 = FFABS(prev2[0] - next2[0]); \
47 47
         int temporal_diff1 =(FFABS(prev[mrefs] - c) + FFABS(prev[prefs] - e) )>>1; \
48 48
         int temporal_diff2 =(FFABS(next[mrefs] - c) + FFABS(next[prefs] - e) )>>1; \
49
-        int diff = FFMAX3(temporal_diff0>>1, temporal_diff1, temporal_diff2); \
50
-        int spatial_pred = (c+e)>>1; \
51
-        int spatial_score = FFABS(cur[mrefs-1] - cur[prefs-1]) + FFABS(c-e) \
52
-                          + FFABS(cur[mrefs+1] - cur[prefs+1]) - 1; \
49
+        int diff = FFMAX3(temporal_diff0 >> 1, temporal_diff1, temporal_diff2); \
50
+        int spatial_pred = (c+e) >> 1; \
51
+        int spatial_score = FFABS(cur[mrefs - 1] - cur[prefs - 1]) + FFABS(c-e) \
52
+                          + FFABS(cur[mrefs + 1] - cur[prefs + 1]) - 1; \
53 53
  \
54 54
         CHECK(-1) CHECK(-2) }} }} \
55 55
         CHECK( 1) CHECK( 2) }} }} \
56 56
  \
57 57
         if (mode < 2) { \
58
-            int b = (prev2[2*mrefs] + next2[2*mrefs])>>1; \
59
-            int f = (prev2[2*prefs] + next2[2*prefs])>>1; \
60
-            int max = FFMAX3(d-e, d-c, FFMIN(b-c, f-e)); \
61
-            int min = FFMIN3(d-e, d-c, FFMAX(b-c, f-e)); \
58
+            int b = (prev2[2 * mrefs] + next2[2 * mrefs])>>1; \
59
+            int f = (prev2[2 * prefs] + next2[2 * prefs])>>1; \
60
+            int max = FFMAX3(d - e, d - c, FFMIN(b - c, f - e)); \
61
+            int min = FFMIN3(d - e, d - c, FFMAX(b - c, f - e)); \
62 62
  \
63 63
             diff = FFMAX3(diff, min, -max); \
64 64
         } \
... ...
@@ -91,7 +93,8 @@ static void filter_line_c(uint8_t *dst,
91 91
 
92 92
 static void filter_line_c_16bit(uint16_t *dst,
93 93
                                 uint16_t *prev, uint16_t *cur, uint16_t *next,
94
-                                int w, int prefs, int mrefs, int parity, int mode)
94
+                                int w, int prefs, int mrefs, int parity,
95
+                                int mode)
95 96
 {
96 97
     int x;
97 98
     uint16_t *prev2 = parity ? prev : cur ;
... ...
@@ -129,11 +132,11 @@ static void filter(AVFilterContext *ctx, AVFilterBufferRef *dstpic,
129 129
 
130 130
         for (y = 0; y < h; y++) {
131 131
             if ((y ^ parity) & 1) {
132
-                uint8_t *prev = &yadif->prev->data[i][y*refs];
133
-                uint8_t *cur  = &yadif->cur ->data[i][y*refs];
134
-                uint8_t *next = &yadif->next->data[i][y*refs];
135
-                uint8_t *dst  = &dstpic->data[i][y*dstpic->linesize[i]];
136
-                int     mode  = y==1 || y+2==h ? 2 : yadif->mode;
132
+                uint8_t *prev = &yadif->prev->data[i][y * refs];
133
+                uint8_t *cur  = &yadif->cur ->data[i][y * refs];
134
+                uint8_t *next = &yadif->next->data[i][y * refs];
135
+                uint8_t *dst  = &dstpic->data[i][y * dstpic->linesize[i]];
136
+                int     mode  = y == 1 || y + 2 == h ? 2 : yadif->mode;
137 137
                 int     prefs = y+1<h ? refs : -refs;
138 138
                 int     mrefs =     y ?-refs :  refs;
139 139
 
... ...
@@ -151,10 +154,12 @@ static void filter(AVFilterContext *ctx, AVFilterBufferRef *dstpic,
151 151
                     cur = tmp;
152 152
                 }
153 153
 
154
-                yadif->filter_line(dst, prev, cur, next, w, prefs, mrefs, parity ^ tff, mode);
154
+                yadif->filter_line(dst, prev, cur, next, w,
155
+                                   prefs, mrefs,
156
+                                   parity ^ tff, mode);
155 157
             } else {
156
-                memcpy(&dstpic->data[i][y*dstpic->linesize[i]],
157
-                       &yadif->cur->data[i][y*refs], w*df);
158
+                memcpy(&dstpic->data[i][y * dstpic->linesize[i]],
159
+                       &yadif->cur->data[i][y * refs], w * df);
158 160
             }
159 161
         }
160 162
     }
... ...
@@ -165,19 +170,18 @@ static void filter(AVFilterContext *ctx, AVFilterBufferRef *dstpic,
165 165
 static int return_frame(AVFilterContext *ctx, int is_second)
166 166
 {
167 167
     YADIFContext *yadif = ctx->priv;
168
-    AVFilterLink *link= ctx->outputs[0];
168
+    AVFilterLink *link  = ctx->outputs[0];
169 169
     int tff, ret;
170 170
 
171 171
     if (yadif->parity == -1) {
172 172
         tff = yadif->cur->video->interlaced ?
173
-            yadif->cur->video->top_field_first : 1;
173
+              yadif->cur->video->top_field_first : 1;
174 174
     } else {
175
-        tff = yadif->parity^1;
175
+        tff = yadif->parity ^ 1;
176 176
     }
177 177
 
178 178
     if (is_second) {
179
-        yadif->out = ff_get_video_buffer(link, AV_PERM_WRITE | AV_PERM_PRESERVE |
180
-                                         AV_PERM_REUSE, link->w, link->h);
179
+        yadif->out = ff_get_video_buffer(link, PERM_RWP, link->w, link->h);
181 180
         if (!yadif->out)
182 181
             return AVERROR(ENOMEM);
183 182
 
... ...
@@ -253,15 +257,17 @@ static int start_frame(AVFilterLink *link, AVFilterBufferRef *picref)
253 253
         !(yadif->prev = avfilter_ref_buffer(yadif->cur, ~AV_PERM_WRITE)))
254 254
         return AVERROR(ENOMEM);
255 255
 
256
-    yadif->out = ff_get_video_buffer(ctx->outputs[0], AV_PERM_WRITE | AV_PERM_PRESERVE |
257
-                                     AV_PERM_REUSE, link->w, link->h);
256
+    yadif->out = ff_get_video_buffer(ctx->outputs[0], PERM_RWP,
257
+                                     link->w, link->h);
258 258
     if (!yadif->out)
259 259
         return AVERROR(ENOMEM);
260 260
 
261 261
     avfilter_copy_buffer_ref_props(yadif->out, yadif->cur);
262 262
     yadif->out->video->interlaced = 0;
263
+
263 264
     if (yadif->out->pts != AV_NOPTS_VALUE)
264 265
         yadif->out->pts *= 2;
266
+
265 267
     return ff_start_frame(ctx->outputs[0], yadif->out);
266 268
 }
267 269
 
... ...
@@ -304,6 +310,7 @@ static int request_frame(AVFilterLink *link)
304 304
 
305 305
         if (ret == AVERROR_EOF && yadif->cur) {
306 306
             AVFilterBufferRef *next = avfilter_ref_buffer(yadif->next, ~AV_PERM_WRITE);
307
+
307 308
             if (!next)
308 309
                 return AVERROR(ENOMEM);
309 310
 
... ...
@@ -332,7 +339,8 @@ static int poll_frame(AVFilterLink *link)
332 332
     if (val <= 0)
333 333
         return val;
334 334
 
335
-    if (val >= 1 && !yadif->next) { //FIXME change API to not requre this red tape
335
+    //FIXME change API to not requre this red tape
336
+    if (val >= 1 && !yadif->next) {
336 337
         if ((ret = ff_request_frame(link->src->inputs[0])) < 0)
337 338
             return ret;
338 339
         val = ff_poll_frame(link->src->inputs[0]);
... ...
@@ -398,14 +406,17 @@ static av_cold int init(AVFilterContext *ctx, const char *args)
398 398
     yadif->auto_enable = 0;
399 399
     yadif->csp = NULL;
400 400
 
401
-    if (args) sscanf(args, "%d:%d:%d", &yadif->mode, &yadif->parity, &yadif->auto_enable);
401
+    if (args)
402
+        sscanf(args, "%d:%d:%d",
403
+               &yadif->mode, &yadif->parity, &yadif->auto_enable);
402 404
 
403 405
     yadif->filter_line = filter_line_c;
404 406
 
405 407
     if (HAVE_MMX)
406 408
         ff_yadif_init_x86(yadif);
407 409
 
408
-    av_log(ctx, AV_LOG_VERBOSE, "mode:%d parity:%d auto_enable:%d\n", yadif->mode, yadif->parity, yadif->auto_enable);
410
+    av_log(ctx, AV_LOG_VERBOSE, "mode:%d parity:%d auto_enable:%d\n",
411
+           yadif->mode, yadif->parity, yadif->auto_enable);
409 412
 
410 413
     return 0;
411 414
 }
... ...
@@ -293,6 +293,7 @@ OBJS-$(CONFIG_RTPDEC)                    += rdt.o         \
293 293
                                             rtpdec_h263_rfc2190.o \
294 294
                                             rtpdec_h264.o \
295 295
                                             rtpdec_ilbc.o \
296
+                                            rtpdec_jpeg.o \
296 297
                                             rtpdec_latm.o \
297 298
                                             rtpdec_mpeg4.o \
298 299
                                             rtpdec_qcelp.o \
... ...
@@ -69,6 +69,7 @@ void av_register_rtp_dynamic_payload_handlers(void)
69 69
     ff_register_dynamic_payload_handler(&ff_h263_rfc2190_dynamic_handler);
70 70
     ff_register_dynamic_payload_handler(&ff_h264_dynamic_handler);
71 71
     ff_register_dynamic_payload_handler(&ff_ilbc_dynamic_handler);
72
+    ff_register_dynamic_payload_handler(&ff_jpeg_dynamic_handler);
72 73
     ff_register_dynamic_payload_handler(&ff_vorbis_dynamic_handler);
73 74
     ff_register_dynamic_payload_handler(&ff_theora_dynamic_handler);
74 75
     ff_register_dynamic_payload_handler(&ff_qdm2_dynamic_handler);
... ...
@@ -46,6 +46,7 @@ extern RTPDynamicProtocolHandler ff_h263_2000_dynamic_handler;
46 46
 extern RTPDynamicProtocolHandler ff_h263_rfc2190_dynamic_handler;
47 47
 extern RTPDynamicProtocolHandler ff_h264_dynamic_handler;
48 48
 extern RTPDynamicProtocolHandler ff_ilbc_dynamic_handler;
49
+extern RTPDynamicProtocolHandler ff_jpeg_dynamic_handler;
49 50
 extern RTPDynamicProtocolHandler ff_mp4a_latm_dynamic_handler;
50 51
 extern RTPDynamicProtocolHandler ff_mp4v_es_dynamic_handler;
51 52
 extern RTPDynamicProtocolHandler ff_mpeg4_generic_dynamic_handler;
52 53
new file mode 100644
... ...
@@ -0,0 +1,331 @@
0
+/*
1
+ * RTP JPEG-compressed Video Depacketizer, RFC 2435
2
+ * Copyright (c) 2012 Samuel Pitoiset
3
+ *
4
+ * This file is part of FFmpeg.
5
+ *
6
+ * FFmpeg is free software; you can redistribute it and/or
7
+ * modify it under the terms of the GNU Lesser General Public
8
+ * License as published by the Free Software Foundation; either
9
+ * version 2.1 of the License, or (at your option) any later version.
10
+ *
11
+ * FFmpeg is distributed in the hope that it will be useful,
12
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14
+ * Lesser General Public License for more details.
15
+ *
16
+ * You should have received a copy of the GNU Lesser General Public
17
+ * License along with FFmpeg; if not, write to the Free Software
18
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19
+ */
20
+
21
+#include "avformat.h"
22
+#include "rtpdec_formats.h"
23
+#include "libavutil/intreadwrite.h"
24
+#include "libavcodec/mjpeg.h"
25
+
26
+/**
27
+ * RTP/JPEG specific private data.
28
+ */
29
+struct PayloadContext {
30
+    AVIOContext *frame;         ///< current frame buffer
31
+    uint32_t    timestamp;      ///< current frame timestamp
32
+    int         hdr_size;       ///< size of the current frame header
33
+};
34
+
35
+static PayloadContext *jpeg_new_context(void)
36
+{
37
+    return av_mallocz(sizeof(PayloadContext));
38
+}
39
+
40
+static inline void free_frame_if_needed(PayloadContext *jpeg)
41
+{
42
+    if (jpeg->frame) {
43
+        uint8_t *p;
44
+        avio_close_dyn_buf(jpeg->frame, &p);
45
+        av_free(p);
46
+        jpeg->frame = NULL;
47
+    }
48
+}
49
+
50
+static void jpeg_free_context(PayloadContext *jpeg)
51
+{
52
+    free_frame_if_needed(jpeg);
53
+    av_free(jpeg);
54
+}
55
+
56
+static void jpeg_create_huffman_table(PutBitContext *p, int table_class,
57
+                                      int table_id, const uint8_t *bits_table,
58
+                                      const uint8_t *value_table)
59
+{
60
+    int i, n = 0;
61
+
62
+    put_bits(p, 8, 0);
63
+    put_bits(p, 4, table_class);
64
+    put_bits(p, 4, table_id);
65
+
66
+    for (i = 1; i <= 16; i++) {
67
+        n += bits_table[i];
68
+        put_bits(p, 8, bits_table[i]);
69
+    }
70
+
71
+    for (i = 0; i < n; i++) {
72
+        put_bits(p, 8, value_table[i]);
73
+    }
74
+}
75
+
76
+static int jpeg_create_header(uint8_t *buf, int size, uint32_t type, uint32_t w,
77
+                              uint32_t h, const uint8_t *qtable, int nb_qtable)
78
+{
79
+    PutBitContext pbc;
80
+
81
+    init_put_bits(&pbc, buf, size);
82
+
83
+    /* Convert from blocks to pixels. */
84
+    w <<= 3;
85
+    h <<= 3;
86
+
87
+    /* SOI */
88
+    put_marker(&pbc, SOI);
89
+
90
+    /* JFIF header */
91
+    put_marker(&pbc, APP0);
92
+    put_bits(&pbc, 16, 16);
93
+    avpriv_put_string(&pbc, "JFIF", 1);
94
+    put_bits(&pbc, 16, 0x0201);
95
+    put_bits(&pbc, 8, 0);
96
+    put_bits(&pbc, 16, 1);
97
+    put_bits(&pbc, 16, 1);
98
+    put_bits(&pbc, 8, 0);
99
+    put_bits(&pbc, 8, 0);
100
+
101
+    /* DQT */
102
+    put_marker(&pbc, DQT);
103
+    if (nb_qtable == 2) {
104
+        put_bits(&pbc, 16, 2 + 2 * (1 + 64));
105
+    } else {
106
+        put_bits(&pbc, 16, 2 + 1 * (1 + 64));
107
+    }
108
+    put_bits(&pbc, 8, 0);
109
+
110
+    /* Each table is an array of 64 values given in zig-zag
111
+     * order, identical to the format used in a JFIF DQT
112
+     * marker segment. */
113
+    avpriv_copy_bits(&pbc, qtable, 64 * 8);
114
+
115
+    if (nb_qtable == 2) {
116
+        put_bits(&pbc, 8, 1);
117
+        avpriv_copy_bits(&pbc, qtable + 64, 64 * 8);
118
+    }
119
+
120
+    /* DHT */
121
+    put_marker(&pbc, DHT);
122
+
123
+    jpeg_create_huffman_table(&pbc, 0, 0, avpriv_mjpeg_bits_dc_luminance,
124
+                              avpriv_mjpeg_val_dc);
125
+    jpeg_create_huffman_table(&pbc, 0, 1, avpriv_mjpeg_bits_dc_chrominance,
126
+                              avpriv_mjpeg_val_dc);
127
+    jpeg_create_huffman_table(&pbc, 1, 0, avpriv_mjpeg_bits_ac_luminance,
128
+                              avpriv_mjpeg_val_ac_luminance);
129
+    jpeg_create_huffman_table(&pbc, 1, 1, avpriv_mjpeg_bits_ac_chrominance,
130
+                              avpriv_mjpeg_val_ac_chrominance);
131
+
132
+    /* SOF0 */
133
+    put_marker(&pbc, SOF0);
134
+    put_bits(&pbc, 16, 17);
135
+    put_bits(&pbc, 8, 8);
136
+    put_bits(&pbc, 8, h >> 8);
137
+    put_bits(&pbc, 8, h);
138
+    put_bits(&pbc, 8, w >> 8);
139
+    put_bits(&pbc, 8, w);
140
+    put_bits(&pbc, 8, 3);
141
+    put_bits(&pbc, 8, 1);
142
+    put_bits(&pbc, 8, type ? 34 : 33);
143
+    put_bits(&pbc, 8, 0);
144
+    put_bits(&pbc, 8, 2);
145
+    put_bits(&pbc, 8, 17);
146
+    put_bits(&pbc, 8, nb_qtable == 2 ? 1 : 0);
147
+    put_bits(&pbc, 8, 3);
148
+    put_bits(&pbc, 8, 17);
149
+    put_bits(&pbc, 8, nb_qtable == 2 ? 1 : 0);
150
+
151
+    /* SOS */
152
+    put_marker(&pbc, SOS);
153
+    put_bits(&pbc, 16, 12);
154
+    put_bits(&pbc, 8, 3);
155
+    put_bits(&pbc, 8, 1);
156
+    put_bits(&pbc, 8, 0);
157
+    put_bits(&pbc, 8, 2);
158
+    put_bits(&pbc, 8, 17);
159
+    put_bits(&pbc, 8, 3);
160
+    put_bits(&pbc, 8, 17);
161
+    put_bits(&pbc, 8, 0);
162
+    put_bits(&pbc, 8, 63);
163
+    put_bits(&pbc, 8, 0);
164
+
165
+    /* Fill the buffer. */
166
+    flush_put_bits(&pbc);
167
+
168
+    /* Return the length in bytes of the JPEG header. */
169
+    return put_bits_count(&pbc) / 8;
170
+}
171
+
172
+static int jpeg_parse_packet(AVFormatContext *ctx, PayloadContext *jpeg,
173
+                             AVStream *st, AVPacket *pkt, uint32_t *timestamp,
174
+                             const uint8_t *buf, int len, int flags)
175
+{
176
+    uint8_t type, q, width, height;
177
+    const uint8_t *qtables = NULL;
178
+    uint16_t qtable_len;
179
+    uint32_t off;
180
+    int ret;
181
+
182
+    if (len < 8) {
183
+        av_log(ctx, AV_LOG_ERROR, "Too short RTP/JPEG packet.\n");
184
+        return AVERROR_INVALIDDATA;
185
+    }
186
+
187
+    /* Parse the main JPEG header. */
188
+    off    = AV_RB24(buf + 1);  /* fragment byte offset */
189
+    type   = AV_RB8(buf + 4);   /* id of jpeg decoder params */
190
+    q      = AV_RB8(buf + 5);   /* quantization factor (or table id) */
191
+    width  = AV_RB8(buf + 6);   /* frame width in 8 pixel blocks */
192
+    height = AV_RB8(buf + 7);   /* frame height in 8 pixel blocks */
193
+    buf += 8;
194
+    len -= 8;
195
+
196
+    /* Parse the restart marker header. */
197
+    if (type > 63) {
198
+        av_log(ctx, AV_LOG_ERROR,
199
+               "Unimplemented RTP/JPEG restart marker header.\n");
200
+        return AVERROR_PATCHWELCOME;
201
+    }
202
+
203
+    /* Parse the quantization table header. */
204
+    if (q > 127 && off == 0) {
205
+        uint8_t precision;
206
+
207
+        if (len < 4) {
208
+            av_log(ctx, AV_LOG_ERROR, "Too short RTP/JPEG packet.\n");
209
+            return AVERROR_INVALIDDATA;
210
+        }
211
+
212
+        /* The first byte is reserved for future use. */
213
+        precision  = AV_RB8(buf + 1);    /* size of coefficients */
214
+        qtable_len = AV_RB16(buf + 2);   /* length in bytes */
215
+        buf += 4;
216
+        len -= 4;
217
+
218
+        if (precision)
219
+            av_log(ctx, AV_LOG_WARNING, "Only 8-bit precision is supported.\n");
220
+
221
+        if (q == 255 && qtable_len == 0) {
222
+            av_log(ctx, AV_LOG_ERROR,
223
+                   "Invalid RTP/JPEG packet. Quantization tables not found.\n");
224
+            return AVERROR_INVALIDDATA;
225
+        }
226
+
227
+        if (qtable_len > 0) {
228
+            if (len < qtable_len) {
229
+                av_log(ctx, AV_LOG_ERROR, "Too short RTP/JPEG packet.\n");
230
+                return AVERROR_INVALIDDATA;
231
+            }
232
+            qtables = buf;
233
+            buf += qtable_len;
234
+            len -= qtable_len;
235
+        }
236
+    }
237
+
238
+    if (off == 0) {
239
+        /* Start of JPEG data packet. */
240
+        uint8_t hdr[1024];
241
+
242
+        /* Skip the current frame in case of the end packet
243
+         * has been lost somewhere. */
244
+        free_frame_if_needed(jpeg);
245
+
246
+        if ((ret = avio_open_dyn_buf(&jpeg->frame)) < 0)
247
+            return ret;
248
+        jpeg->timestamp = *timestamp;
249
+
250
+        if (!qtables) {
251
+            av_log(ctx, AV_LOG_ERROR,
252
+                   "Unimplemented default quantization tables.\n");
253
+            return AVERROR_PATCHWELCOME;
254
+        }
255
+
256
+        /* Generate a frame and scan headers that can be prepended to the
257
+         * RTP/JPEG data payload to produce a JPEG compressed image in
258
+         * interchange format. */
259
+        jpeg->hdr_size = jpeg_create_header(hdr, sizeof(hdr), type, width,
260
+                                            height, qtables,
261
+                                            qtable_len > 64 ? 2 : 1);
262
+
263
+        /* Copy JPEG header to frame buffer. */
264
+        avio_write(jpeg->frame, hdr, jpeg->hdr_size);
265
+    }
266
+
267
+    if (!jpeg->frame) {
268
+        av_log(ctx, AV_LOG_ERROR,
269
+               "Received packet without a start chunk; dropping frame.\n");
270
+        return AVERROR(EAGAIN);
271
+    }
272
+
273
+    if (jpeg->timestamp != *timestamp) {
274
+        /* Skip the current frame if timestamp is incorrect.
275
+         * A start packet has been lost somewhere. */
276
+        free_frame_if_needed(jpeg);
277
+        av_log(ctx, AV_LOG_ERROR, "RTP timestamps don't match.\n");
278
+        return AVERROR_INVALIDDATA;
279
+    }
280
+
281
+    if (off != avio_tell(jpeg->frame) - jpeg->hdr_size) {
282
+        av_log(ctx, AV_LOG_ERROR,
283
+               "Missing packets; dropping frame.\n");
284
+        return AVERROR(EAGAIN);
285
+    }
286
+
287
+    /* Copy data to frame buffer. */
288
+    avio_write(jpeg->frame, buf, len);
289
+
290
+    if (flags & RTP_FLAG_MARKER) {
291
+        /* End of JPEG data packet. */
292
+        PutBitContext pbc;
293
+        uint8_t buf[2];
294
+
295
+        /* Put EOI marker. */
296
+        init_put_bits(&pbc, buf, sizeof(buf));
297
+        put_marker(&pbc, EOI);
298
+        flush_put_bits(&pbc);
299
+        avio_write(jpeg->frame, buf, sizeof(buf));
300
+
301
+        /* Prepare the JPEG packet. */
302
+        av_init_packet(pkt);
303
+        pkt->size = avio_close_dyn_buf(jpeg->frame, &pkt->data);
304
+        if (pkt->size < 0) {
305
+            av_log(ctx, AV_LOG_ERROR,
306
+                   "Error occured when getting frame buffer.\n");
307
+            jpeg->frame = NULL;
308
+            return pkt->size;
309
+        }
310
+        pkt->stream_index = st->index;
311
+        pkt->destruct     = av_destruct_packet;
312
+
313
+        /* Re-init the frame buffer. */
314
+        jpeg->frame = NULL;
315
+
316
+        return 0;
317
+    }
318
+
319
+    return AVERROR(EAGAIN);
320
+}
321
+
322
+RTPDynamicProtocolHandler ff_jpeg_dynamic_handler = {
323
+    .enc_name          = "JPEG",
324
+    .codec_type        = AVMEDIA_TYPE_VIDEO,
325
+    .codec_id          = AV_CODEC_ID_MJPEG,
326
+    .alloc             = jpeg_new_context,
327
+    .free              = jpeg_free_context,
328
+    .parse_packet      = jpeg_parse_packet,
329
+    .static_payload_id = 26,
330
+};
... ...
@@ -30,8 +30,8 @@
30 30
 #include "libavutil/avutil.h"
31 31
 
32 32
 #define LIBAVFORMAT_VERSION_MAJOR 54
33
-#define LIBAVFORMAT_VERSION_MINOR 25
34
-#define LIBAVFORMAT_VERSION_MICRO 105
33
+#define LIBAVFORMAT_VERSION_MINOR 26
34
+#define LIBAVFORMAT_VERSION_MICRO 100
35 35
 
36 36
 #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
37 37
                                                LIBAVFORMAT_VERSION_MINOR, \
... ...
@@ -1,41 +1,33 @@
1 1
 FATE_MP3 += fate-mp3-float-conf-compl
2 2
 fate-mp3-float-conf-compl: CMD = pcm -acodec mp3float -i $(SAMPLES)/mp3-conformance/compl.bit
3
-fate-mp3-float-conf-compl: CMP = stddev
4 3
 fate-mp3-float-conf-compl: REF = $(SAMPLES)/mp3-conformance/compl.pcm
5 4
 
6 5
 FATE_MP3 += fate-mp3-float-conf-he_32khz
7 6
 fate-mp3-float-conf-he_32khz: CMD = pcm -acodec mp3float -i $(SAMPLES)/mp3-conformance/he_32khz.bit -fs 343296
8
-fate-mp3-float-conf-he_32khz: CMP = stddev
9 7
 fate-mp3-float-conf-he_32khz: REF = $(SAMPLES)/mp3-conformance/he_32khz.pcm
10 8
 
11 9
 FATE_MP3 += fate-mp3-float-conf-he_44khz
12 10
 fate-mp3-float-conf-he_44khz: CMD = pcm -acodec mp3float -i $(SAMPLES)/mp3-conformance/he_44khz.bit -fs 942336
13
-fate-mp3-float-conf-he_44khz: CMP = stddev
14 11
 fate-mp3-float-conf-he_44khz: REF = $(SAMPLES)/mp3-conformance/he_44khz.pcm
15 12
 
16 13
 FATE_MP3 += fate-mp3-float-conf-he_48khz
17 14
 fate-mp3-float-conf-he_48khz: CMD = pcm -acodec mp3float -i $(SAMPLES)/mp3-conformance/he_48khz.bit -fs 343296
18
-fate-mp3-float-conf-he_48khz: CMP = stddev
19 15
 fate-mp3-float-conf-he_48khz: REF = $(SAMPLES)/mp3-conformance/he_48khz.pcm
20 16
 
21 17
 FATE_MP3 += fate-mp3-float-conf-hecommon
22 18
 fate-mp3-float-conf-hecommon: CMD = pcm -acodec mp3float -i $(SAMPLES)/mp3-conformance/hecommon.bit -fs 133632
23
-fate-mp3-float-conf-hecommon: CMP = stddev
24 19
 fate-mp3-float-conf-hecommon: REF = $(SAMPLES)/mp3-conformance/hecommon.pcm
25 20
 
26 21
 FATE_MP3 += fate-mp3-float-conf-si
27 22
 fate-mp3-float-conf-si: CMD = pcm -acodec mp3float -i $(SAMPLES)/mp3-conformance/si.bit -fs 269568
28
-fate-mp3-float-conf-si: CMP = stddev
29 23
 fate-mp3-float-conf-si: REF = $(SAMPLES)/mp3-conformance/si.pcm
30 24
 
31 25
 FATE_MP3 += fate-mp3-float-conf-si_block
32 26
 fate-mp3-float-conf-si_block: CMD = pcm -acodec mp3float -i $(SAMPLES)/mp3-conformance/si_block.bit -fs 145152
33
-fate-mp3-float-conf-si_block: CMP = stddev
34 27
 fate-mp3-float-conf-si_block: REF = $(SAMPLES)/mp3-conformance/si_block.pcm
35 28
 
36 29
 FATE_MP3 += fate-mp3-float-extra_overread
37 30
 fate-mp3-float-extra_overread: CMD = pcm -c:a mp3float -i $(SAMPLES)/mpegaudio/extra_overread.mp3
38
-fate-mp3-float-extra_overread: CMP = stddev
39 31
 fate-mp3-float-extra_overread: REF = $(SAMPLES)/mpegaudio/extra_overread.pcm
40 32
 
41 33
 FATE_SAMPLES_AVCONV += $(FATE_MP3)