You've already forked FFmpeg
							
							
				mirror of
				https://github.com/FFmpeg/FFmpeg.git
				synced 2025-10-30 23:18:11 +02:00 
			
		
		
		
	Add "Memory buffer source filter" from SOC.
This is needed by the current SOC-ffmpeg.c code. Originally committed as revision 23039 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
		
							
								
								
									
										140
									
								
								libavfilter/vsrc_buffer.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										140
									
								
								libavfilter/vsrc_buffer.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,140 @@ | ||||
| /* | ||||
|  * Memory buffer source filter | ||||
|  * Copyright (c) 2008 Vitor Sessak | ||||
|  * | ||||
|  * This file is part of FFmpeg. | ||||
|  * | ||||
|  * FFmpeg is free software; you can redistribute it and/or | ||||
|  * modify it under the terms of the GNU Lesser General Public | ||||
|  * License as published by the Free Software Foundation; either | ||||
|  * version 2.1 of the License, or (at your option) any later version. | ||||
|  * | ||||
|  * FFmpeg is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||||
|  * Lesser General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU Lesser General Public | ||||
|  * License along with FFmpeg; if not, write to the Free Software | ||||
|  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | ||||
|  */ | ||||
|  | ||||
| #include "avfilter.h" | ||||
| #include "vsrc_buffer.h" | ||||
|  | ||||
| typedef struct { | ||||
|     int64_t           pts; | ||||
|     AVFrame           frame; | ||||
|     int               has_frame; | ||||
|     int               h, w, pix_fmt; | ||||
|     AVRational        pixel_aspect; | ||||
| } BufferSourceContext; | ||||
|  | ||||
|  | ||||
| int av_vsrc_buffer_add_frame(AVFilterContext *buffer_filter, AVFrame *frame, | ||||
|                              int64_t pts, AVRational pixel_aspect) | ||||
| { | ||||
|     BufferSourceContext *c = buffer_filter->priv; | ||||
|  | ||||
|     if (c->has_frame) { | ||||
|         av_log(buffer_filter, AV_LOG_ERROR, | ||||
|                "Buffering several frames is not supported. " | ||||
|                "Please consume all available frames before adding a new one.\n" | ||||
|             ); | ||||
|         //return -1; | ||||
|     } | ||||
|  | ||||
|     memcpy(c->frame.data    , frame->data    , sizeof(frame->data)); | ||||
|     memcpy(c->frame.linesize, frame->linesize, sizeof(frame->linesize)); | ||||
|     c->pts = pts; | ||||
|     c->pixel_aspect = pixel_aspect; | ||||
|     c->has_frame = 1; | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| static av_cold int init(AVFilterContext *ctx, const char *args, void *opaque) | ||||
| { | ||||
|     BufferSourceContext *c = ctx->priv; | ||||
|  | ||||
|     if(args && sscanf(args, "%d:%d:%d", &c->w, &c->h, &c->pix_fmt) == 3) | ||||
|         return 0; | ||||
|  | ||||
|     av_log(ctx, AV_LOG_ERROR, "init() expected 3 arguments:'%s'\n", args); | ||||
|     return -1; | ||||
| } | ||||
|  | ||||
| static int query_formats(AVFilterContext *ctx) | ||||
| { | ||||
|     BufferSourceContext *c = ctx->priv; | ||||
|     enum PixelFormat pix_fmts[] = { c->pix_fmt, PIX_FMT_NONE }; | ||||
|  | ||||
|     avfilter_set_common_formats(ctx, avfilter_make_format_list(pix_fmts)); | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| static int config_props(AVFilterLink *link) | ||||
| { | ||||
|     BufferSourceContext *c = link->src->priv; | ||||
|  | ||||
|     link->w = c->w; | ||||
|     link->h = c->h; | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
|  | ||||
| static int request_frame(AVFilterLink *link) | ||||
| { | ||||
|     BufferSourceContext *c = link->src->priv; | ||||
|     AVFilterPicRef *picref; | ||||
|  | ||||
|     if (!c->has_frame) { | ||||
|         av_log(link->src, AV_LOG_ERROR, | ||||
|                "request_frame() called with no available frame!\n"); | ||||
|         //return -1; | ||||
|     } | ||||
|  | ||||
|     /* This picture will be needed unmodified later for decoding the next | ||||
|      * frame */ | ||||
|     picref = avfilter_get_video_buffer(link, AV_PERM_WRITE | AV_PERM_PRESERVE | | ||||
|                                        AV_PERM_REUSE2, | ||||
|                                        link->w, link->h); | ||||
|  | ||||
|     av_picture_copy((AVPicture *)&picref->data, (AVPicture *)&c->frame, | ||||
|                     picref->pic->format, link->w, link->h); | ||||
|  | ||||
|     picref->pts = c->pts; | ||||
|     picref->pixel_aspect = c->pixel_aspect; | ||||
|     avfilter_start_frame(link, avfilter_ref_pic(picref, ~0)); | ||||
|     avfilter_draw_slice(link, 0, link->h, 1); | ||||
|     avfilter_end_frame(link); | ||||
|     avfilter_unref_pic(picref); | ||||
|  | ||||
|     c->has_frame = 0; | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| static int poll_frame(AVFilterLink *link) | ||||
| { | ||||
|     BufferSourceContext *c = link->src->priv; | ||||
|     return !!(c->has_frame); | ||||
| } | ||||
|  | ||||
| AVFilter avfilter_vsrc_buffer = | ||||
| { | ||||
|     .name      = "buffer", | ||||
|     .priv_size = sizeof(BufferSourceContext), | ||||
|     .query_formats = query_formats, | ||||
|  | ||||
|     .init      = init, | ||||
|  | ||||
|     .inputs    = (AVFilterPad[]) {{ .name = NULL }}, | ||||
|     .outputs   = (AVFilterPad[]) {{ .name            = "default", | ||||
|                                     .type            = AVMEDIA_TYPE_VIDEO, | ||||
|                                     .request_frame   = request_frame, | ||||
|                                     .poll_frame      = poll_frame, | ||||
|                                     .config_props    = config_props, }, | ||||
|                                   { .name = NULL}}, | ||||
| }; | ||||
							
								
								
									
										24
									
								
								libavfilter/vsrc_buffer.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								libavfilter/vsrc_buffer.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,24 @@ | ||||
| /* | ||||
|  * Memory buffer source filter | ||||
|  * Copyright (c) 2008 Vitor Sessak | ||||
|  * | ||||
|  * This file is part of FFmpeg. | ||||
|  * | ||||
|  * FFmpeg is free software; you can redistribute it and/or | ||||
|  * modify it under the terms of the GNU Lesser General Public | ||||
|  * License as published by the Free Software Foundation; either | ||||
|  * version 2.1 of the License, or (at your option) any later version. | ||||
|  * | ||||
|  * FFmpeg is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||||
|  * Lesser General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU Lesser General Public | ||||
|  * License along with FFmpeg; if not, write to the Free Software | ||||
|  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | ||||
|  */ | ||||
|  | ||||
| int av_vsrc_buffer_add_frame(AVFilterContext *buffer_filter, AVFrame *frame, | ||||
|                              int64_t pts, AVRational pixel_aspect); | ||||
|  | ||||
		Reference in New Issue
	
	Block a user