FFmpeg
Loading...
Searching...
No Matches
omaenc.c
Go to the documentation of this file.
1/*
2 * Sony OpenMG (OMA) muxer
3 *
4 * Copyright (c) 2011 Michael Karcher
5 *
6 * This file is part of FFmpeg.
7 *
8 * FFmpeg is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
12 *
13 * FFmpeg is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
17 *
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with FFmpeg; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21 */
22
23#include "avformat.h"
24#include "avio_internal.h"
25#include "id3v2.h"
26#include "internal.h"
27#include "mux.h"
28#include "oma.h"
29#include "rawenc.h"
30
32{
34 int srate_index;
35 int isjointstereo;
36
37 par = s->streams[0]->codecpar;
38 /* check for support of the format first */
39
40 for (srate_index = 0; ; srate_index++) {
41 if (ff_oma_srate_tab[srate_index] == 0) {
42 av_log(s, AV_LOG_ERROR, "Sample rate %d not supported in OpenMG audio\n",
43 par->sample_rate);
44 return AVERROR(EINVAL);
45 }
46
47 if (ff_oma_srate_tab[srate_index] * 100 == par->sample_rate)
48 break;
49 }
50
51 /* Metadata; OpenMG does not support ID3v2.4 */
53
54 ffio_wfourcc(s->pb, "EA3\0");
55 avio_w8(s->pb, EA3_HEADER_SIZE >> 7);
56 avio_w8(s->pb, EA3_HEADER_SIZE & 0x7F);
57 avio_wl16(s->pb, 0xFFFF); /* not encrypted */
58 ffio_fill(s->pb, 0, 6 * 4); /* Padding + DRM id */
59
60 switch (par->codec_tag) {
62 if (par->ch_layout.nb_channels != 2) {
63 av_log(s, AV_LOG_ERROR, "ATRAC3 in OMA is only supported with 2 channels\n");
64 return AVERROR(EINVAL);
65 }
66 if (par->extradata_size == 14) /* WAV format extradata */
67 isjointstereo = par->extradata[6] != 0;
68 else if(par->extradata_size == 10) /* RM format extradata */
69 isjointstereo = par->extradata[8] == 0x12;
70 else {
71 av_log(s, AV_LOG_ERROR, "ATRAC3: Unsupported extradata size\n");
72 return AVERROR(EINVAL);
73 }
74 avio_wb32(s->pb, (OMA_CODECID_ATRAC3 << 24) |
75 (isjointstereo << 17) |
76 (srate_index << 13) |
77 (par->block_align/8));
78 break;
80 avio_wb32(s->pb, (OMA_CODECID_ATRAC3P << 24) |
81 (srate_index << 13) |
82 (par->ch_layout.nb_channels << 10) |
83 (par->block_align/8 - 1));
84 break;
85 default:
86 av_log(s, AV_LOG_ERROR, "unsupported codec tag %s for write\n",
88 return AVERROR(EINVAL);
89 }
90 ffio_fill(s->pb, 0, EA3_HEADER_SIZE - 36); /* Padding */
91
92 return 0;
93}
94
96 .p.name = "oma",
97 .p.long_name = NULL_IF_CONFIG_SMALL("Sony OpenMG audio"),
98 .p.mime_type = "audio/x-oma",
99 .p.extensions = "oma",
100 .p.video_codec = AV_CODEC_ID_NONE,
101 .p.audio_codec = AV_CODEC_ID_ATRAC3,
102 .p.subtitle_codec = AV_CODEC_ID_NONE,
103 .write_header = oma_write_header,
104 .write_packet = ff_raw_write_packet,
105 .p.codec_tag = ff_oma_codec_tags_list,
106 .p.flags = AVFMT_NOTIMESTAMPS,
107 .flags_internal = FF_OFMT_FLAG_MAX_ONE_OF_EACH,
108};
const FFOutputFormat ff_oma_muxer
Definition omaenc.c:95
Main libavformat public API header.
#define AVFMT_NOTIMESTAMPS
Format does not need / have any timestamps.
Definition avformat.h:498
void avio_wl16(AVIOContext *s, unsigned int val)
Definition aviobuf.c:440
void avio_w8(AVIOContext *s, int b)
Definition aviobuf.c:184
void avio_wb32(AVIOContext *s, unsigned int val)
Definition aviobuf.c:368
static av_always_inline void ffio_wfourcc(AVIOContext *pb, const uint8_t *s)
void ffio_fill(AVIOContext *s, int b, int64_t count)
Definition aviobuf.c:192
#define s(width, name)
Definition cbs_vp9.c:198
@ AV_CODEC_ID_NONE
Definition codec_id.h:48
@ AV_CODEC_ID_ATRAC3
Definition codec_id.h:484
#define AVERROR(e)
Definition error.h:45
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition log.h:210
#define av_fourcc2str(fourcc)
Definition avutil.h:323
int ff_id3v2_write_simple(struct AVFormatContext *s, int id3v2_version, const char *magic)
Write an ID3v2 tag containing all global metadata from s.
Definition id3v2enc.c:576
int ff_raw_write_packet(AVFormatContext *s, AVPacket *pkt)
Definition rawenc.c:31
#define av_cold
Definition attributes.h:117
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
Definition internal.h:88
#define FF_OFMT_FLAG_MAX_ONE_OF_EACH
If this flag is set, it indicates that for each codec type whose corresponding default codec (i....
Definition mux.h:50
const AVCodecTag *const ff_oma_codec_tags_list[]
Definition oma.c:39
const uint16_t ff_oma_srate_tab[8]
Definition oma.c:26
#define EA3_HEADER_SIZE
Definition oma.h:30
#define ID3v2_EA3_MAGIC
Definition oma.h:31
@ OMA_CODECID_ATRAC3P
Definition oma.h:36
@ OMA_CODECID_ATRAC3
Definition oma.h:35
static av_cold int oma_write_header(AVFormatContext *s)
Definition omaenc.c:31
int nb_channels
Number of channels in this layout.
This struct describes the properties of an encoded stream.
Definition codec_par.h:49
int extradata_size
Size of the extradata content in bytes.
Definition codec_par.h:75
AVChannelLayout ch_layout
The channel layout and number of channels.
Definition codec_par.h:207
int block_align
The number of bytes per coded audio frame, required by some formats.
Definition codec_par.h:221
uint32_t codec_tag
Additional information about the codec (corresponds to the AVI FOURCC).
Definition codec_par.h:61
uint8_t * extradata
Extra binary data needed for initializing the decoder, codec-dependent.
Definition codec_par.h:71
int sample_rate
The number of audio samples per second.
Definition codec_par.h:213
Format I/O context.
Definition avformat.h:1333
#define av_log(a,...)