all: $(TARGET)
$(LOCAL_FFMPEG_OBJS):
- if [ $(LOCAL_FFMPEG) ] ; then \
- $(MAKE) -C ffmpeg lib ; \
- fi
+ if [ $(LOCAL_FFMPEG) ] ; then \
+ $(MAKE) -C ffmpeg lib ; \
+ fi
$(TARGET): $(OBJS) $(LOCAL_FFMPEG_OBJS)
- $(CC) $(SHFLAGS) -o $@ $(OBJS) $(LDFLAGS)
+ $(CC) $(SHFLAGS) -o $@ $(OBJS) $(LDFLAGS)
depend: $(SRCS)
- if [ $(LOCAL_FFMPEG) ] ; then $(MAKE) -C ffmpeg dep ; fi
- $(CC) -MM $(CFLAGS) $^ 1>.depend
+ if [ $(LOCAL_FFMPEG) ] ; then $(MAKE) -C ffmpeg dep ; fi
+ $(CC) -MM $(CFLAGS) $^ 1>.depend
distclean: clean
- if [ $(LOCAL_FFMPEG) ] ; then $(MAKE) -C ffmpeg distclean ; fi
- rm -f .depend
+ if [ $(LOCAL_FFMPEG) ] ; then $(MAKE) -C ffmpeg distclean ; fi
+ rm -f .depend
clean:
- #if [ $(LOCAL_FFMPEG) ] ; then $(MAKE) -C ffmpeg clean ; fi
- rm -f $(OBJS) $(TARGET)
+ #if [ $(LOCAL_FFMPEG) ] ; then $(MAKE) -C ffmpeg clean ; fi
+ rm -f $(OBJS) $(TARGET)
install: all
- install -m 755 $(TARGET) "$(DESTDIR)$(libdir)/mlt"
+ install -m 755 $(TARGET) "$(DESTDIR)$(libdir)/mlt"
+ install -d "$(DESTDIR)$(prefix)/share/mlt/avformat"
+ install -m 644 producer_avformat.yml "$(DESTDIR)$(prefix)/share/mlt/avformat"
+
+uninstall:
+ rm "$(DESTDIR)$(libdir)/mlt/libmltavformat$(LIBSUF)"
+ rm -rf "$(DESTDIR)$(prefix)/share/mlt/avformat"
ifneq ($(wildcard .depend),)
include .depend
#include <string.h>
#include <pthread.h>
+#include <limits.h>
#include <framework/mlt.h>
return NULL;
}
+static mlt_properties avformat_metadata( mlt_service_type type, const char *id, void *data )
+{
+ char file[ PATH_MAX ];
+ char *service_type = NULL;
+ switch ( type )
+ {
+ case consumer_type:
+ service_type = "consumer";
+ break;
+ case filter_type:
+ service_type = "filter";
+ break;
+ case producer_type:
+ service_type = "producer";
+ break;
+ case transition_type:
+ service_type = "transition";
+ break;
+ default:
+ return NULL;
+ }
+ snprintf( file, PATH_MAX, "%s/avformat/%s_%s.yml", mlt_environment( "MLT_DATA" ), service_type, id );
+ return mlt_properties_parse_yaml( file );
+}
+
MLT_REPOSITORY
{
MLT_REGISTER( consumer_type, "avformat", create_service );
MLT_REGISTER( filter_type, "avcolor_space", create_service );
MLT_REGISTER( filter_type, "avdeinterlace", create_service );
MLT_REGISTER( filter_type, "avresample", create_service );
+
+ MLT_REGISTER_METADATA( producer_type, "avformat", avformat_metadata, NULL );
}
--- /dev/null
+schema version: 0.1
+type: producer # consumer, filter, producer, or transition
+identifier: avformat
+title: FFmpeg Reader
+version: 0.2.5
+copyright: Copyright (C) 2003-2008 Ushodaya Enterprises Limited
+license: LGPL
+language: en
+url: http://www.ffmpeg.org/
+creator: Charles Yates
+contributor:
+ - Dan Dennedy
+tags:
+ - Audio # this may produce audio
+ - Video # this may produce video
+description: Read an audio and/or video file using FFmpeg
+icon:
+ filename: avformat/producer.png # relative to $MLT_DATA/modules/
+ content-type: image/png
+ content-encoding: base64 # could also be hex or none if inline SVG
+ content: |
+ iVBORw0KGgoAAAANSUhEUgAAABgAAAAPCAYAAAD+pA/bAAAABmJLR0QA/wD/AP+gvaeTAAAACXBI
+ WXMAAAsSAAALEgHS3X78AAAAB3RJTUUH1gsBEgMLZIL+swAAAB10RVh0Q29tbWVudABDcmVhdGVk
+ IHdpdGggVGhlIEdJTVDvZCVuAAAEgUlEQVQ4y2VUSWwbZRT+5p/xP4v3eIntceLEThOylKgkB070
+ UAUOCNFDFYkIVeqBijMHQKiCAwLEDbVIPVQCUalFQggph6pUoWKRWoS6RCGJ04biOG7sOI638TJe
+ xjM/FwwRfKf3vve99+kd3uNubNxgVb0Km2W7Tbt06fQLpwv4G8u3k6/88nvJcXYhnJ+dGfsRR/Dl
+ 8tqpfKkZJ736d++cf6nU53Nra0utTOarVrMpdCj9XFhJr2C1sQq1pZ6ac8zNAljpi7ezzc+e5Lvx
+ je29H8rlyk8DA14GAOl05tT1n6tf39uqBM69GFgAsNjvaezsvKVfuyZkKxXIi4tvknn/PCQi4cA4
+ QMQf+aIv3Nvbm0sVTGe9zfDg8eGxUrk83689eFQcyhStQLluYG+/NNfny6VSsLW5Ge3pOjSHAy2e
+ /4TwjP84KAfBKRzW99f59G7aAQCVav20SZQAtdlQbfGxteTuNACkd/dsguR8W9NNiKKEVFbjisUi
+ BQAtnz8rFAq+LgAWDjN/IpEkk97JzYQjAdkhI2fkwtVG9X0AWN+pwTA5iJSH1qEoaMZC8tFjfv3J
+ IckcdiYNk0GUZVRbXKipt5YAoP7wYZDXNKHOGKR4fCs+NbVGBpwDt3zw3VEUBbqo437qvjuXy7kr
+ HbtqWQzUJgC8Ar2Dpe1UXpgZC763W+RAOAaR2tAxRTmV3kvsJJPjSrf7umEYqAoC1NnZVCAY3CLD
+ 6nBpfnC+4hJc4B08DGqc1xr1l5126RzAIHAWqCjjj1wb8eHQq9uZ6nS9a4PAmaACD8bLWN16itrG
+ hoJ8Ptw2TVjRKAZjsWUAIABACHk3RmOQ7BIyegbpg/1oqWGBoAc0U5BFAt20o1CqXSk26YLZM8Aa
+ u5AEAwKV4XQNLHpGRq5zpRJ0QuCdmUGpUPgGAAQAoKBPJ5wTyDfzKLMyGMGntRZAmIHxMA/TTnDA
+ e3FvM+siXhfMdgXjIQbmUpCvMjTa7fFG5imUdhtNSYIcCCxHx8Y6/2zgUTwNq2Nd8FIvYAHFch1d
+ RmHjuhhVfdnjI1LPYVeQaw3gsMZAmYYTk+oT1SdBkiSU6z3U6k30AHR9PrhU9WYoHP7XYHR41Jpw
+ TxSDQhAuzgXLtIMQG0RioFwuX3IrwiWPnUByDsKyGPxKB5S3Phj0UkgiRdMQ0FYcqBECFgj8GY7F
+ 7vZvg/QDl+S66mg5fg2IATDBC45jkPgOJhODLa8dN4d8BJQKYN06RgfF/eNTibRpWVcdsg2MV1An
+ FJrbDfXEiWxEVdf/ZxCPxVvTnmkjqgzB4p0gMGGnPUyMjUANupNusXNHpDxYt4wR1XtrKBq9a3W0
+ B047hSg7ofUIxMlJePz+K0d/FjmahLyh146rzyUNw0Jby8LGWvckSbwcjUayx1RpzWZWELR3jZln
+ Eh8CwDFVgcLr4HpNVDtMi588ecEbCHx7dKZwNBkODed+W318Zipk3Rx1iTG9GbwYiUQMAAj53Zef
+ H2u/Ua16L4ZCgykA8A94vn/W1DdH3dK0wIdXwkNDH+E/+Avfv/E5LPIz8wAAAABJRU5ErkJggg==
+
+notes: Implementation or additional usage notes go here.
+bugs: # this can be just for documentation, or the tool may disclose it to help user avoid pitfalls
+ - Audio sync discrepancy with some content.
+ - Not all libavformat supported formats are seekable.
+ - >
+ Seeking is not always accurate. Sometimes it doesn't seek to I-frames so you
+ may get junk for a few frames.
+ - >
+ Fails to play beyond first frame of video of sources with PTS not starting
+ at 0 (video4linux).
+
+parameters:
+ - identifier: argument # 'argument' is a reserved name for a value supplied to the factory
+ title: File # the title can be used as a label for the widget
+ type: string
+ description: |
+ A file name specification or URL in the form:
+ [{protocol}|{format}]:{resource}[?{format-parameter}[&{format-parameter}...]]
+ For example, video4linux:/dev/video1?width:320&height:240
+ Note: on the bash command line, & must be escaped as '\&'.
+ Also, note the use of ':' instead of '=' for parameters.
+ Use 'ffmpeg -formats' to see a list of supported protocols and formats.
+ readonly: no
+ required: yes
+ mutable: no
+ widget: fileopen # could provide a button to use a file-open dialog
+
+ - identifier: audio_index # the name is the mlt_properties name
+ title: Audio Index
+ type: integer
+ # the description can be used in a tool tip
+ description: Choose the index of audio stream to use (-1 is off)
+ readonly: no
+ mutable: no
+ minimum: -1
+ # when maximum not specified, the scalar limit is used
+ default: 0
+ widget: spinner
+
+ - identifier: video_index
+ title: Video Index
+ type: integer
+ description: Choose the index of video stream to use (-1 is off)
+ readonly: no
+ mutable: no
+ minimum: -1
+ default: 0
+ widget: spinner
+
+ - identifier: in
+ title: In Point
+ type: time # time is not implemented, but it will correspond to the mlt_position replacement
+ description: Set the start time offset to use within the clip
+ readonly: no
+ mutable: no
+ minimum: 0
+ default: 0
+ widget: timecode # this is a special form of time value/code entry (e.g. see Kino)
+
+ - identifier: out
+ title: Out Point
+ type: time
+ description: Set the ending time offset to use within the clip
+ readonly: no
+ minimum: 0
+ mutable: no
+ widget: timecode # as opposed to time, which could be confused for a wallclock-style time widget
+
+ - identifier: threads
+ title: Decoding Threads
+ type: integer
+ description: Choose the number of threads to use in the decoder(s)
+ readonly: no
+ mutable: no
+ minimum: 0
+ maximum: 4
+ default: 1
+ widget: spinner
+ unit: threads # the unit is a label that appears after the widget
+
+ - identifier: force_aspect_ratio
+ title: Sample Aspect Ratio
+ type: float
+ description: Optionally override a (mis)detected aspect ratio
+ readonly: no
+ mutable: yes
+ minimum: 0.001 # just a UI suggestion
+ maximum: 9.999 # just a suggestion
+ # no default property means it should be blank in the UI and not applied unless provided
+
+ - identifier: resource
+ title: File
+ type: string
+ description: file or protocol specification
+ readonly: yes
+
+ - identifier: source_fps
+ title: Frame Rate
+ type: float
+ scale: 2 # scale is the number of digits to display after the decimal point
+ description: the framerate of the resource
+ readonly: yes
+ unit: frames/second
+
+ - identifier: aspect_ratio
+ title: Sample Aspect Ratio
+ type: float
+ description: >
+ The sample aspect ratio of the resource.
+ This is determined on every frame read.
+ readonly: yes
+
+ - identifier: length
+ title: Duration
+ type: time
+ description: duration
+ readonly: yes
+ widget: timecode
+
+ - identifier: seekable
+ title: Supports Seek
+ type: integer
+ description: if the resource can seek
+ readonly: yes