Skip to content

Commit 5175b83

Browse files
committed
Re-org
1 parent dac70ab commit 5175b83

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+761
-795
lines changed

_old/audio.go

Lines changed: 332 additions & 51 deletions
Large diffs are not rendered by default.
File renamed without changes.
File renamed without changes.

_old/media.go

100755100644
Lines changed: 222 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -2,30 +2,231 @@ package media
22

33
import (
44
"context"
5-
"net/url"
6-
"strings"
5+
"io"
6+
"time"
77
)
88

99
////////////////////////////////////////////////////////////////////////////////
1010
// TYPES
1111

12-
type (
13-
MediaKey string
14-
MediaFlag uint64
15-
DecodeIteratorFunc func(context.Context, MediaPacket) error
16-
)
12+
// MediaFlag is a bitfield of flags for media, including type of media
13+
type MediaFlag uint
14+
15+
// MediaKey is a string which is used for media metadata
16+
type MediaKey string
17+
18+
// Demux is a function which is called for each packet in the media, which
19+
// is associated with a single stream. The function should return an error if
20+
// the decode should be terminated.
21+
type DemuxFn func(context.Context, Packet) error
22+
23+
// DecodeFn is a function which is called for each frame in the media, which
24+
// is associated with a single stream. The function should return an error if
25+
// the decode should be terminated.
26+
type DecodeFn func(context.Context, Frame) error
1727

1828
////////////////////////////////////////////////////////////////////////////////
1929
// INTERFACES
2030

21-
// Media represents either input or output media
31+
// Manager is an interface to the ffmpeg media library for media manipulation
32+
type Manager interface {
33+
io.Closer
34+
35+
// Enumerate formats with MEDIA_FLAG_ENCODER, MEDIA_FLAG_DECODER,
36+
// MEDIA_FLAG_FILE and MEDIA_FLAG_DEVICE flags to filter.
37+
// Lookups can be further filtered by name, mimetype and extension
38+
MediaFormats(MediaFlag, ...string) []MediaFormat
39+
40+
// Open media file for reading and return it. A format can be specified
41+
// to "force" a specific format
42+
OpenFile(string, MediaFormat) (Media, error)
43+
44+
// Open media URL for reading and return it. A format can be specified
45+
// to "force" a specific format
46+
OpenURL(string, MediaFormat) (Media, error)
47+
48+
// Open media device with a specific name for reading and return it.
49+
OpenDevice(string) (Media, error)
50+
51+
// Create file for writing and return it
52+
CreateFile(string) (Media, error)
53+
54+
// Create an output device with a specific name for writing and return it
55+
CreateDevice(string) (Media, error)
56+
57+
// Create a map of input media. If MediaFlag is MEDIA_FLAG_NONE, then
58+
// all audio, video and subtitle streams are mapped, or else a
59+
// combination of MEDIA_FLAG_AUDIO,
60+
// MEDIA_FLAG_VIDEO, MEDIA_FLAG_SUBTITLE and MEDIA_FLAG_DATA
61+
// can be used to map specific types of streams.
62+
Map(Media, MediaFlag) (Map, error)
63+
64+
// Demux a media file, passing packets to a callback function
65+
Demux(context.Context, Map, DemuxFn) error
66+
67+
// Decode a packet into a series of frames, passing decoded frames to
68+
// a callback function
69+
Decode(context.Context, Map, Packet, DecodeFn) error
70+
71+
// Log messages from ffmpeg
72+
SetDebug(bool)
73+
}
74+
75+
// MediaFormat is an input or output format for media items
76+
type MediaFormat interface {
77+
// Return the names of the media format
78+
Name() []string
79+
80+
// Return a longer description of the media format
81+
Description() string
82+
83+
// Return MEDIA_FLAG_ENCODER, MEDIA_FLAG_DECODER, MEDIA_FLAG_FILE
84+
// and MEDIA_FLAG_DEVICE flags
85+
Flags() MediaFlag
86+
87+
// Return mimetypes handled
88+
MimeType() []string
89+
90+
// Return file extensions handled
91+
Ext() []string
92+
93+
// Return the default audio codec for the format
94+
DefaultAudioCodec() Codec
95+
96+
// Return the default video codec for the format
97+
DefaultVideoCodec() Codec
98+
99+
// Return the default subtitle codec for the format
100+
DefaultSubtitleCodec() Codec
101+
}
102+
103+
// Map is a mapping of input media, potentially to output media
104+
type Map interface {
105+
// Return input media
106+
Input() Media
107+
108+
// Return a single stream which is mapped for decoding, filtering by
109+
// stream type. Returns nil if there is no selection of that type
110+
Streams(MediaFlag) []Stream
111+
112+
// Print a summary of the mapping
113+
PrintMap(w io.Writer)
114+
115+
// Resample an audio stream
116+
Resample(AudioFormat, Stream) error
117+
118+
// Encode to output media using default codec from a specific stream
119+
//Encode(Media, Stream) error
120+
}
121+
122+
// Media is a source or destination of media
22123
type Media interface {
23-
URL() *url.URL // Return URL for the media location
24-
Flags() MediaFlag // Return flags
124+
io.Closer
125+
126+
// URL for the media
127+
URL() string
128+
129+
// Return enumeration of streams
130+
Streams() []Stream
131+
132+
// Return media flags for the media
133+
Flags() MediaFlag
134+
135+
// Return the format of the media
136+
Format() MediaFormat
137+
138+
// Return metadata for the media
139+
Metadata() Metadata
140+
141+
// Set metadata value by key, or remove it if the value is nil
142+
Set(MediaKey, any) error
143+
}
144+
145+
// Stream of data multiplexed in the media
146+
type Stream interface {
147+
// Return index of stream in the media
148+
Index() int
149+
150+
// Return media flags for the stream
151+
Flags() MediaFlag
152+
153+
// Return artwork for the stream - if MEDIA_FLAG_ARTWORK is set
154+
Artwork() []byte
155+
}
156+
157+
// Metadata embedded in the media
158+
type Metadata interface {
159+
// Return enumeration of keys
160+
Keys() []MediaKey
161+
162+
// Return value for key
163+
Value(MediaKey) any
164+
}
165+
166+
// Packet is a single unit of data in the media
167+
type Packet interface {
168+
// Flags returns the flags for the packet from the stream
169+
Flags() MediaFlag
170+
171+
// Stream returns the stream which the packet belongs to
172+
Stream() Stream
173+
174+
// IsKeyFrame returns true if the packet contains a key frame
175+
IsKeyFrame() bool
176+
177+
// Pos returns the byte position of the packet in the media
178+
Pos() int64
179+
180+
// Duration returns the duration of the packet
181+
Duration() time.Duration
182+
183+
// Size of the packet in bytes
184+
Size() int
185+
186+
// Bytes returns the raw bytes of the packet
187+
Bytes() []byte
188+
}
189+
190+
// Frame is a decoded video or audio frame
191+
type Frame interface {
192+
AudioFrame
193+
VideoFrame
194+
195+
// Returns MEDIA_FLAG_VIDEO, MEDIA_FLAG_AUDIO
196+
Flags() MediaFlag
197+
198+
// Returns true if planar format
199+
//IsPlanar() bool
200+
201+
// Returns the samples for a specified channel, as array of bytes. For packed
202+
// audio format, the channel should be 0.
203+
//Bytes(channel int) []byte
25204
}
26205

27-
// MediaCodec is the codec and parameters
28-
type MediaCodec interface {
206+
type AudioFrame interface {
207+
// Returns the audio format, if MEDIA_FLAG_AUDIO is set
208+
AudioFormat() AudioFormat
209+
210+
// Number of samples, if MEDIA_FLAG_AUDIO is set
211+
NumSamples() int
212+
213+
// Audio channels, if MEDIA_FLAG_AUDIO is set
214+
Channels() []AudioChannel
215+
216+
// Duration of the frame, if MEDIA_FLAG_AUDIO is set
217+
Duration() time.Duration
218+
}
219+
220+
type VideoFrame interface {
221+
// Returns the audio format, if MEDIA_FLAG_VIDEO is set
222+
PixelFormat() PixelFormat
223+
224+
// Return frame width and height, if MEDIA_FLAG_VIDEO is set
225+
Size() (int, int)
226+
}
227+
228+
// Codec is an encoder or decoder for a specific media type
229+
type Codec interface {
29230
// Name returns the unique name for the codec
30231
Name() string
31232

@@ -36,23 +237,17 @@ type MediaCodec interface {
36237
Flags() MediaFlag
37238
}
38239

39-
// MediaPacket is a packet of data from a stream
40-
type MediaPacket interface {
41-
Size() int
42-
Bytes() []byte
43-
Stream() int
44-
}
45-
46240
////////////////////////////////////////////////////////////////////////////////
47241
// CONSTANTS
48242

49243
const (
50244
MEDIA_FLAG_ALBUM MediaFlag = (1 << iota) // Is part of an album
51245
MEDIA_FLAG_ALBUM_TRACK // Is an album track
52-
MEDIA_FLAG_ALBUM_COMPILATION // Album is a compliation
246+
MEDIA_FLAG_ALBUM_COMPILATION // Album is a compilation
53247
MEDIA_FLAG_TVSHOW // Is part of a TV Show
54248
MEDIA_FLAG_TVSHOW_EPISODE // Is a TV Show episode
55249
MEDIA_FLAG_FILE // Is a file
250+
MEDIA_FLAG_DEVICE // Is a device
56251
MEDIA_FLAG_VIDEO // Contains video
57252
MEDIA_FLAG_AUDIO // Contains audio
58253
MEDIA_FLAG_SUBTITLE // Contains subtitles
@@ -63,7 +258,6 @@ const (
63258
MEDIA_FLAG_ENCODER // Is an encoder
64259
MEDIA_FLAG_DECODER // Is an decoder
65260
MEDIA_FLAG_NONE MediaFlag = 0
66-
MEDIA_FLAG_MIN = MEDIA_FLAG_ALBUM
67261
MEDIA_FLAG_MAX = MEDIA_FLAG_DECODER
68262
)
69263

@@ -78,7 +272,7 @@ const (
78272
MEDIA_KEY_COMPOSER MediaKey = "composer" // string
79273
MEDIA_KEY_COPYRIGHT MediaKey = "copyright" // string
80274
MEDIA_KEY_YEAR MediaKey = "date" // uint
81-
MEDIA_KEY_DISC MediaKey = "disc" // uint
275+
MEDIA_KEY_DISC MediaKey = "disc" // uint xx or xx/yy
82276
MEDIA_KEY_ENCODED_BY MediaKey = "encoded_by" // string
83277
MEDIA_KEY_FILENAME MediaKey = "filename" // string
84278
MEDIA_KEY_GENRE MediaKey = "genre" // string
@@ -88,7 +282,7 @@ const (
88282
MEDIA_KEY_SERVICE_NAME MediaKey = "service_name" // string
89283
MEDIA_KEY_SERVICE_PROVIDER MediaKey = "service_provider" // string
90284
MEDIA_KEY_TITLE MediaKey = "title" // string
91-
MEDIA_KEY_TRACK MediaKey = "track" // uint
285+
MEDIA_KEY_TRACK MediaKey = "track" // uint xx or xx/yy
92286
MEDIA_KEY_VERSION_MAJOR MediaKey = "major_version" // string
93287
MEDIA_KEY_VERSION_MINOR MediaKey = "minor_version" // string
94288
MEDIA_KEY_SHOW MediaKey = "show" // string
@@ -116,12 +310,12 @@ func (f MediaFlag) String() string {
116310
return f.FlagString()
117311
}
118312
str := ""
119-
for v := MEDIA_FLAG_MIN; v <= MEDIA_FLAG_MAX; v <<= 1 {
313+
for v := MediaFlag(1); v <= MEDIA_FLAG_MAX; v <<= 1 {
120314
if f&v == v {
121-
str += v.FlagString() + "|"
315+
str += "|" + v.FlagString()
122316
}
123317
}
124-
return strings.TrimSuffix(str, "|")
318+
return str[1:]
125319
}
126320

127321
func (f MediaFlag) FlagString() string {
@@ -140,6 +334,8 @@ func (f MediaFlag) FlagString() string {
140334
return "MEDIA_FLAG_TVSHOW_EPISODE"
141335
case MEDIA_FLAG_FILE:
142336
return "MEDIA_FLAG_FILE"
337+
case MEDIA_FLAG_DEVICE:
338+
return "MEDIA_FLAG_DEVICE"
143339
case MEDIA_FLAG_VIDEO:
144340
return "MEDIA_FLAG_VIDEO"
145341
case MEDIA_FLAG_AUDIO:
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.

0 commit comments

Comments
 (0)