1 |
pacho 14/06/25 09:32:27 |
2 |
|
3 |
Added: gst-plugins-libav-1.2.4-ffmpeg2.patch |
4 |
gst-plugins-libav-1.2.4-fix-memory-leak.patch |
5 |
Log: |
6 |
Version bump, fix memory leak (#494282) |
7 |
|
8 |
(Portage version: 2.2.10/cvs/Linux x86_64, signed Manifest commit with key A188FBD4) |
9 |
|
10 |
Revision Changes Path |
11 |
1.1 media-plugins/gst-plugins-libav/files/gst-plugins-libav-1.2.4-ffmpeg2.patch |
12 |
|
13 |
file : http://sources.gentoo.org/viewvc.cgi/gentoo-x86/media-plugins/gst-plugins-libav/files/gst-plugins-libav-1.2.4-ffmpeg2.patch?rev=1.1&view=markup |
14 |
plain: http://sources.gentoo.org/viewvc.cgi/gentoo-x86/media-plugins/gst-plugins-libav/files/gst-plugins-libav-1.2.4-ffmpeg2.patch?rev=1.1&content-type=text/plain |
15 |
|
16 |
Index: gst-plugins-libav-1.2.4-ffmpeg2.patch |
17 |
=================================================================== |
18 |
Index: gst-libav-1.2.0/ext/libav/gstavauddec.c |
19 |
=================================================================== |
20 |
--- gst-libav-1.2.0.orig/ext/libav/gstavauddec.c |
21 |
+++ gst-libav-1.2.0/ext/libav/gstavauddec.c |
22 |
@@ -460,7 +460,7 @@ gst_ffmpegauddec_audio_frame (GstFFMpegA |
23 |
GstBuffer ** outbuf, GstFlowReturn * ret) |
24 |
{ |
25 |
gint len = -1; |
26 |
- gint have_data = AVCODEC_MAX_AUDIO_FRAME_SIZE; |
27 |
+ gint have_data = 0; |
28 |
AVPacket packet; |
29 |
AVFrame frame; |
30 |
|
31 |
Index: gst-libav-1.2.0/ext/libav/gstavaudenc.c |
32 |
=================================================================== |
33 |
--- gst-libav-1.2.0.orig/ext/libav/gstavaudenc.c |
34 |
+++ gst-libav-1.2.0/ext/libav/gstavaudenc.c |
35 |
@@ -289,7 +289,6 @@ gst_ffmpegaudenc_set_format (GstAudioEnc |
36 |
ffmpegaudenc->context->coder_type = 0; |
37 |
ffmpegaudenc->context->context_model = 0; |
38 |
ffmpegaudenc->context->scenechange_threshold = 0; |
39 |
- ffmpegaudenc->context->inter_threshold = 0; |
40 |
|
41 |
/* fetch pix_fmt and so on */ |
42 |
gst_ffmpeg_audioinfo_to_context (info, ffmpegaudenc->context); |
43 |
Index: gst-libav-1.2.0/ext/libav/gstavcfg.c |
44 |
=================================================================== |
45 |
--- gst-libav-1.2.0.orig/ext/libav/gstavcfg.c |
46 |
+++ gst-libav-1.2.0/ext/libav/gstavcfg.c |
47 |
@@ -171,13 +171,10 @@ gst_ffmpeg_idct_algo_get_type (void) |
48 |
{FF_IDCT_INT, "JPEG reference Integer", "int"}, |
49 |
{FF_IDCT_SIMPLE, "Simple", "simple"}, |
50 |
{FF_IDCT_SIMPLEMMX, "Simple MMX", "simplemmx"}, |
51 |
- {FF_IDCT_LIBMPEG2MMX, "LIBMPEG2MMX", "libmpeg2mmx"}, |
52 |
{FF_IDCT_ARM, "ARM", "arm"}, |
53 |
{FF_IDCT_ALTIVEC, "ALTIVEC", "altivec"}, |
54 |
{FF_IDCT_SH4, "SH4", "sh4"}, |
55 |
{FF_IDCT_SIMPLEARM, "SIMPLEARM", "simplearm"}, |
56 |
- {FF_IDCT_H264, "H264", "h264"}, |
57 |
- {FF_IDCT_VP3, "VP3", "vp3"}, |
58 |
{FF_IDCT_IPP, "IPP", "ipp"}, |
59 |
{FF_IDCT_XVIDMMX, "XVIDMMX", "xvidmmx"}, |
60 |
{0, NULL, NULL}, |
61 |
@@ -274,9 +271,6 @@ gst_ffmpeg_flags_get_type (void) |
62 |
"global-headers"}, |
63 |
{CODEC_FLAG_AC_PRED, "H263 Advanced Intra Coding / MPEG4 AC prediction", |
64 |
"aic"}, |
65 |
- {CODEC_FLAG_CBP_RD, "Rate Distoration Optimization for CBP", "cbp-rd"}, |
66 |
- {CODEC_FLAG_QP_RD, "Rate Distoration Optimization for QP selection", |
67 |
- "qp-rd"}, |
68 |
{CODEC_FLAG_CLOSED_GOP, "Closed GOP", "closedgop"}, |
69 |
{0, NULL, NULL}, |
70 |
}; |
71 |
@@ -564,18 +558,6 @@ gst_ffmpeg_cfg_init (void) |
72 |
-100, G_MAXINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); |
73 |
gst_ffmpeg_add_pspec (pspec, max_key_interval, FALSE, mpeg, NULL); |
74 |
|
75 |
- pspec = g_param_spec_int ("luma-elim-threshold", |
76 |
- "Luma Elimination Threshold", |
77 |
- "Luma Single Coefficient Elimination Threshold", |
78 |
- -99, 99, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); |
79 |
- gst_ffmpeg_add_pspec (pspec, config.luma_elim_threshold, FALSE, mpeg, NULL); |
80 |
- |
81 |
- pspec = g_param_spec_int ("chroma-elim-threshold", |
82 |
- "Chroma Elimination Threshold", |
83 |
- "Chroma Single Coefficient Elimination Threshold", |
84 |
- -99, 99, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); |
85 |
- gst_ffmpeg_add_pspec (pspec, config.chroma_elim_threshold, FALSE, mpeg, NULL); |
86 |
- |
87 |
pspec = g_param_spec_float ("lumi-masking", "Luminance Masking", |
88 |
"Luminance Masking", -1.0f, 1.0f, 0.0f, |
89 |
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); |
90 |
Index: gst-libav-1.2.0/ext/libav/gstavcodecmap.c |
91 |
=================================================================== |
92 |
--- gst-libav-1.2.0.orig/ext/libav/gstavcodecmap.c |
93 |
+++ gst-libav-1.2.0/ext/libav/gstavcodecmap.c |
94 |
@@ -788,12 +788,10 @@ gst_ffmpeg_codecid_to_caps (enum AVCodec |
95 |
break; |
96 |
} |
97 |
|
98 |
- /* FIXME: context->sub_id must be filled in during decoding */ |
99 |
caps = |
100 |
gst_ff_vid_caps_new (context, NULL, codec_id, encode, |
101 |
"video/x-pn-realvideo", "rmversion", G_TYPE_INT, version, NULL); |
102 |
if (context) { |
103 |
- gst_caps_set_simple (caps, "format", G_TYPE_INT, context->sub_id, NULL); |
104 |
if (context->extradata_size >= 8) { |
105 |
gst_caps_set_simple (caps, |
106 |
"subformat", G_TYPE_INT, GST_READ_UINT32_BE (context->extradata), |
107 |
@@ -2892,18 +2890,6 @@ gst_ffmpeg_caps_with_codecid (enum AVCod |
108 |
} |
109 |
break; |
110 |
|
111 |
- case AV_CODEC_ID_RV10: |
112 |
- case AV_CODEC_ID_RV20: |
113 |
- case AV_CODEC_ID_RV30: |
114 |
- case AV_CODEC_ID_RV40: |
115 |
- { |
116 |
- gint format; |
117 |
- |
118 |
- if (gst_structure_get_int (str, "format", &format)) |
119 |
- context->sub_id = format; |
120 |
- |
121 |
- break; |
122 |
- } |
123 |
case AV_CODEC_ID_COOK: |
124 |
case AV_CODEC_ID_RA_288: |
125 |
case AV_CODEC_ID_RA_144: |
126 |
Index: gst-libav-1.2.0/ext/libav/gstavvidenc.c |
127 |
=================================================================== |
128 |
--- gst-libav-1.2.0.orig/ext/libav/gstavvidenc.c |
129 |
+++ gst-libav-1.2.0/ext/libav/gstavvidenc.c |
130 |
@@ -338,7 +338,6 @@ gst_ffmpegvidenc_set_format (GstVideoEnc |
131 |
ffmpegenc->context->coder_type = 0; |
132 |
ffmpegenc->context->context_model = 0; |
133 |
ffmpegenc->context->scenechange_threshold = 0; |
134 |
- ffmpegenc->context->inter_threshold = 0; |
135 |
|
136 |
/* and last but not least the pass; CBR, 2-pass, etc */ |
137 |
ffmpegenc->context->flags |= ffmpegenc->pass; |
138 |
|
139 |
|
140 |
|
141 |
1.1 media-plugins/gst-plugins-libav/files/gst-plugins-libav-1.2.4-fix-memory-leak.patch |
142 |
|
143 |
file : http://sources.gentoo.org/viewvc.cgi/gentoo-x86/media-plugins/gst-plugins-libav/files/gst-plugins-libav-1.2.4-fix-memory-leak.patch?rev=1.1&view=markup |
144 |
plain: http://sources.gentoo.org/viewvc.cgi/gentoo-x86/media-plugins/gst-plugins-libav/files/gst-plugins-libav-1.2.4-fix-memory-leak.patch?rev=1.1&content-type=text/plain |
145 |
|
146 |
Index: gst-plugins-libav-1.2.4-fix-memory-leak.patch |
147 |
=================================================================== |
148 |
--- ext/libav/gstavviddec.c |
149 |
+++ ext/libav/gstavviddec.c |
150 |
@@ -523,6 +523,7 @@ open_failed: |
151 |
|
152 |
typedef struct |
153 |
{ |
154 |
+ GstFFMpegVidDec *ffmpegdec; |
155 |
GstVideoCodecFrame *frame; |
156 |
gboolean mapped; |
157 |
GstVideoFrame vframe; |
158 |
@@ -530,13 +531,17 @@ typedef struct |
159 |
} GstFFMpegVidDecVideoFrame; |
160 |
|
161 |
static GstFFMpegVidDecVideoFrame * |
162 |
-gst_ffmpegviddec_video_frame_new (GstVideoCodecFrame * frame) |
163 |
+gst_ffmpegviddec_video_frame_new (GstFFMpegVidDec * ffmpegdec, |
164 |
+ GstVideoCodecFrame * frame) |
165 |
{ |
166 |
GstFFMpegVidDecVideoFrame *dframe; |
167 |
|
168 |
dframe = g_slice_new0 (GstFFMpegVidDecVideoFrame); |
169 |
+ dframe->ffmpegdec = ffmpegdec; |
170 |
dframe->frame = frame; |
171 |
|
172 |
+ GST_DEBUG_OBJECT (ffmpegdec, "new video frame %p", dframe); |
173 |
+ |
174 |
return dframe; |
175 |
} |
176 |
|
177 |
@@ -544,6 +549,8 @@ static void |
178 |
gst_ffmpegviddec_video_frame_free (GstFFMpegVidDec * ffmpegdec, |
179 |
GstFFMpegVidDecVideoFrame * frame) |
180 |
{ |
181 |
+ GST_DEBUG_OBJECT (ffmpegdec, "free video frame %p", frame); |
182 |
+ |
183 |
if (frame->mapped) |
184 |
gst_video_frame_unmap (&frame->vframe); |
185 |
gst_video_decoder_release_frame (GST_VIDEO_DECODER (ffmpegdec), frame->frame); |
186 |
@@ -551,6 +558,14 @@ gst_ffmpegviddec_video_frame_free (GstFFMpegVidDec * ffmpegdec, |
187 |
g_slice_free (GstFFMpegVidDecVideoFrame, frame); |
188 |
} |
189 |
|
190 |
+static void |
191 |
+dummy_free_buffer (void *opaque, uint8_t * data) |
192 |
+{ |
193 |
+ GstFFMpegVidDecVideoFrame *frame = opaque; |
194 |
+ |
195 |
+ gst_ffmpegviddec_video_frame_free (frame->ffmpegdec, frame); |
196 |
+} |
197 |
+ |
198 |
/* called when ffmpeg wants us to allocate a buffer to write the decoded frame |
199 |
* into. We try to give it memory from our pool */ |
200 |
static int |
201 |
@@ -589,7 +604,8 @@ gst_ffmpegviddec_get_buffer (AVCodecContext * context, AVFrame * picture) |
202 |
goto duplicate_frame; |
203 |
|
204 |
/* GstFFMpegVidDecVideoFrame receives the frame ref */ |
205 |
- picture->opaque = dframe = gst_ffmpegviddec_video_frame_new (frame); |
206 |
+ picture->opaque = dframe = |
207 |
+ gst_ffmpegviddec_video_frame_new (ffmpegdec, frame); |
208 |
|
209 |
GST_DEBUG_OBJECT (ffmpegdec, "storing opaque %p", dframe); |
210 |
|
211 |
@@ -695,12 +711,20 @@ invalid_frame: |
212 |
fallback: |
213 |
{ |
214 |
int c; |
215 |
+ gboolean first = TRUE; |
216 |
int ret = avcodec_default_get_buffer (context, picture); |
217 |
|
218 |
GST_LOG_OBJECT (ffmpegdec, "performing fallback alloc"); |
219 |
- for (c = 0; c < AV_NUM_DATA_POINTERS; c++) |
220 |
+ for (c = 0; c < AV_NUM_DATA_POINTERS; c++) { |
221 |
ffmpegdec->stride[c] = picture->linesize[c]; |
222 |
|
223 |
+ if (picture->buf[c] == NULL && first) { |
224 |
+ picture->buf[c] = |
225 |
+ av_buffer_create (NULL, 0, dummy_free_buffer, dframe, 0); |
226 |
+ first = FALSE; |
227 |
+ } |
228 |
+ } |
229 |
+ |
230 |
return ret; |
231 |
} |
232 |
duplicate_frame: |
233 |
@@ -1684,8 +1718,8 @@ gst_ffmpegviddec_decide_allocation (GstVideoDecoder * decoder, GstQuery * query) |
234 |
avcodec_align_dimensions2 (ffmpegdec->context, &width, &height, |
235 |
linesize_align); |
236 |
edge = |
237 |
- ffmpegdec->context-> |
238 |
- flags & CODEC_FLAG_EMU_EDGE ? 0 : avcodec_get_edge_width (); |
239 |
+ ffmpegdec-> |
240 |
+ context->flags & CODEC_FLAG_EMU_EDGE ? 0 : avcodec_get_edge_width (); |
241 |
/* increase the size for the padding */ |
242 |
width += edge << 1; |
243 |
height += edge << 1; |