AVOutputFormat has default codecs for audio, video and subtitle and often these are the only codecs of this type allowed. So add a flag to AVOutputFormat so that this can be checked generically. Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
		
			
				
	
	
		
			92 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			92 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
 * Raw AC-4 muxer
 | 
						|
 *
 | 
						|
 * 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 "libavcodec/codec_id.h"
 | 
						|
#include "libavcodec/packet.h"
 | 
						|
#include "libavutil/crc.h"
 | 
						|
#include "libavutil/opt.h"
 | 
						|
#include "avformat.h"
 | 
						|
#include "mux.h"
 | 
						|
 | 
						|
typedef struct AC4Context {
 | 
						|
    AVClass *class;
 | 
						|
    int write_crc;
 | 
						|
} AC4Context;
 | 
						|
 | 
						|
static int ac4_write_packet(AVFormatContext *s, AVPacket *pkt)
 | 
						|
{
 | 
						|
    AC4Context *ac4 = s->priv_data;
 | 
						|
    AVIOContext *pb = s->pb;
 | 
						|
 | 
						|
    if (!pkt->size)
 | 
						|
        return 0;
 | 
						|
 | 
						|
    if (ac4->write_crc)
 | 
						|
        avio_wb16(pb, 0xAC41);
 | 
						|
    else
 | 
						|
        avio_wb16(pb, 0xAC40);
 | 
						|
 | 
						|
    if (pkt->size >= 0xffff) {
 | 
						|
        avio_wb16(pb, 0xffff);
 | 
						|
        avio_wb24(pb, pkt->size);
 | 
						|
    } else {
 | 
						|
        avio_wb16(pb, pkt->size);
 | 
						|
    }
 | 
						|
 | 
						|
    avio_write(pb, pkt->data, pkt->size);
 | 
						|
 | 
						|
    if (ac4->write_crc) {
 | 
						|
        uint16_t crc = av_crc(av_crc_get_table(AV_CRC_16_ANSI), 0, pkt->data, pkt->size);
 | 
						|
        avio_wl16(pb, crc);
 | 
						|
    }
 | 
						|
 | 
						|
    return 0;
 | 
						|
}
 | 
						|
 | 
						|
#define ENC AV_OPT_FLAG_ENCODING_PARAM
 | 
						|
#define OFFSET(obj) offsetof(AC4Context, obj)
 | 
						|
static const AVOption ac4_options[] = {
 | 
						|
    { "write_crc",  "enable checksum", OFFSET(write_crc), AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, ENC},
 | 
						|
    { NULL },
 | 
						|
};
 | 
						|
 | 
						|
static const AVClass ac4_muxer_class = {
 | 
						|
    .class_name     = "AC4 muxer",
 | 
						|
    .item_name      = av_default_item_name,
 | 
						|
    .option         = ac4_options,
 | 
						|
    .version        = LIBAVUTIL_VERSION_INT,
 | 
						|
};
 | 
						|
 | 
						|
const FFOutputFormat ff_ac4_muxer = {
 | 
						|
    .p.name            = "ac4",
 | 
						|
    .p.long_name       = NULL_IF_CONFIG_SMALL("raw AC-4"),
 | 
						|
    .p.mime_type       = "audio/ac4",
 | 
						|
    .p.extensions      = "ac4",
 | 
						|
    .priv_data_size    = sizeof(AC4Context),
 | 
						|
    .p.audio_codec     = AV_CODEC_ID_AC4,
 | 
						|
    .p.video_codec     = AV_CODEC_ID_NONE,
 | 
						|
    .p.subtitle_codec  = AV_CODEC_ID_NONE,
 | 
						|
    .flags_internal    = FF_OFMT_FLAG_MAX_ONE_OF_EACH |
 | 
						|
                         FF_OFMT_FLAG_ONLY_DEFAULT_CODECS,
 | 
						|
    .write_packet      = ac4_write_packet,
 | 
						|
    .p.priv_class      = &ac4_muxer_class,
 | 
						|
    .p.flags           = AVFMT_NOTIMESTAMPS,
 | 
						|
};
 |