实例介绍
【实例截图】
【核心代码】
/*
* libdlna: reference DLNA standards implementation.
* Copyright (C) 2007 Benjamin Zores <ben@geexbox.org>
*
* This file is part of libdlna.
*
* libdlna 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.
*
* libdlna 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 libdlna; if not, write to the Free Software
* Foundation, Inc, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "dlna_internals.h"
#include "profiles.h"
#include "containers.h"
/* Profile for audio media class content */
static dlna_profile_t aac_adts = {
.id = "AAC_ADTS",
.mime = MIME_AUDIO_ADTS,
.label = LABEL_AUDIO_2CH
};
/* Profile for audio media class content */
static dlna_profile_t aac_adts_320 = {
.id = "AAC_ADTS_320",
.mime = MIME_AUDIO_ADTS,
.label = LABEL_AUDIO_2CH
};
/* Profile for audio media class content */
static dlna_profile_t aac_iso = {
.id = "AAC_ISO",
.mime = MIME_AUDIO_MPEG_4,
.label = LABEL_AUDIO_2CH
};
/* Profile for audio media class content */
static dlna_profile_t aac_iso_320 = {
.id = "AAC_ISO_320",
.mime = MIME_AUDIO_MPEG_4,
.label = LABEL_AUDIO_2CH
};
/* Profile for audio media class content. In the case of AAC LTP profiles,
both the ISO file formats and the ADTS format are supported by
the same profile. */
static dlna_profile_t aac_ltp_iso = {
.id = "AAC_LTP_ISO",
.mime = MIME_AUDIO_MPEG_4,
.label = LABEL_AUDIO_2CH
};
/* Profile for audio media class content with up to 5.1 channels */
static dlna_profile_t aac_ltp_mult5_iso = {
.id = "AAC_LTP_MULT5_ISO",
.mime = MIME_AUDIO_MPEG_4,
.label = LABEL_AUDIO_MULTI
};
/* Profile for audio media class content with up to 7.1 channels */
static dlna_profile_t aac_ltp_mult7_iso = {
.id = "AAC_LTP_MULT7_ISO",
.mime = MIME_AUDIO_MPEG_4,
.label = LABEL_AUDIO_MULTI
};
/* Profile for audio media class content with up to 5.1 channels */
static dlna_profile_t aac_mult5_adts = {
.id = "AAC_MULT5_ADTS",
.mime = MIME_AUDIO_ADTS,
.label = LABEL_AUDIO_MULTI
};
/* Profile for audio media class content with up to 5.1 channels */
static dlna_profile_t aac_mult5_iso = {
.id = "AAC_MULT5_ISO",
.mime = MIME_AUDIO_MPEG_4,
.label = LABEL_AUDIO_MULTI
};
/* Profile for audio media class content */
static dlna_profile_t heaac_l2_adts = {
.id = "HEAAC_L2_ADTS",
.mime = MIME_AUDIO_ADTS,
.label = LABEL_AUDIO_2CH
};
/* Profile for audio media class content */
static dlna_profile_t heaac_l2_iso = {
.id = "HEAAC_L2_ISO",
.mime = MIME_AUDIO_MPEG_4,
.label = LABEL_AUDIO_2CH
};
/* Profile for audio media class content */
static dlna_profile_t heaac_l3_adts = {
.id = "HEAAC_L3_ADTS",
.mime = MIME_AUDIO_ADTS,
.label = LABEL_AUDIO_2CH
};
/* Profile for audio media class content */
static dlna_profile_t heaac_l3_iso = {
.id = "HEAAC_L3_ISO",
.mime = MIME_AUDIO_MPEG_4,
.label = LABEL_AUDIO_2CH
};
/* Profile for audio media class content with up to 5.1 channels */
static dlna_profile_t heaac_mult5_adts = {
.id = "HEAAC_MULT5_ADTS",
.mime = MIME_AUDIO_ADTS,
.label = LABEL_AUDIO_MULTI
};
/* Profile for audio media class content with up to 5.1 channels */
static dlna_profile_t heaac_mult5_iso = {
.id = "HEAAC_MULT5_ISO",
.mime = MIME_AUDIO_MPEG_4,
.label = LABEL_AUDIO_MULTI
};
/* Profile for audio media class content */
static dlna_profile_t heaac_l2_adts_320 = {
.id = "HEAAC_L2_ADTS_320",
.mime = MIME_AUDIO_ADTS,
.label = LABEL_AUDIO_2CH
};
/* Profile for audio media class content */
static dlna_profile_t heaac_l2_iso_320 = {
.id = "HEAAC_L2_ISO_320",
.mime = MIME_AUDIO_MPEG_4,
.label = LABEL_AUDIO_2CH
};
/* Profile for audio media class content */
static dlna_profile_t bsac_iso = {
.id = "BSAC_ISO",
.mime = MIME_AUDIO_MPEG_4,
.label = LABEL_AUDIO_2CH
};
/* Profile for audio media class content with up to 5.1 channels */
static dlna_profile_t bsac_mult5_iso = {
.id = "BSAC_MULT5_ISO",
.mime = MIME_AUDIO_MPEG_4,
.label = LABEL_AUDIO_MULTI
};
static dlna_profile_t heaac_v2_l2 = {
.id = "HEAACv2_L2",
.mime = MIME_AUDIO_MPEG_4,
.label = LABEL_AUDIO_2CH
};
static dlna_profile_t heaac_v2_l2_adts = {
.id = "HEAACv2_L2",
.mime = MIME_AUDIO_ADTS,
.label = LABEL_AUDIO_2CH
};
static dlna_profile_t heaac_v2_l2_320 = {
.id = "HEAACv2_L2_320",
.mime = MIME_AUDIO_MPEG_4,
.label = LABEL_AUDIO_2CH
};
static dlna_profile_t heaac_v2_l2_320_adts = {
.id = "HEAACv2_L2_320",
.mime = MIME_AUDIO_ADTS,
.label = LABEL_AUDIO_2CH
};
static dlna_profile_t heaac_v2_l3 = {
.id = "HEAACv2_L3",
.mime = MIME_AUDIO_MPEG_4,
.label = LABEL_AUDIO_2CH
};
static dlna_profile_t heaac_v2_l3_adts = {
.id = "HEAACv2_L3",
.mime = MIME_AUDIO_ADTS,
.label = LABEL_AUDIO_2CH
};
static dlna_profile_t heaac_v2_mult5 = {
.id = "HEAACv2_MULT5",
.mime = MIME_AUDIO_MPEG_4,
.label = LABEL_AUDIO_2CH
};
static dlna_profile_t heaac_v2_mult5_adts = {
.id = "HEAACv2_MULT5",
.mime = MIME_AUDIO_ADTS,
.label = LABEL_AUDIO_2CH
};
typedef enum {
AAC_MUXED, /* AAC is muxed in a container */
AAC_RAW /* AAC is raw (ADTS) */
} aac_container_type_t;
/* HeAACv1 (a.k.a. AACplus v1) is AAC LC Spectral Band Replication (SBR) */
/* HeAACv2 (a.ka.a AACplus v2) is HeAACv1 Parametric Stereo (PS) */
typedef enum {
AAC_INVALID = 0,
AAC_MAIN = 1, /* AAC Main */
AAC_LC = 2, /* AAC Low complexity */
AAC_SSR = 3, /* AAC SSR */
AAC_LTP = 4, /* AAC Long term prediction */
AAC_HE = 5, /* AAC High efficiency (SBR) */
AAC_SCALE = 6, /* Scalable */
AAC_TWINVQ = 7, /* TwinVQ */
AAC_CELP = 8, /* CELP */
AAC_HVXC = 9, /* HVXC */
AAC_TTSI = 12, /* TTSI */
AAC_MS = 13, /* Main synthetic */
AAC_WAVE = 14, /* Wavetable synthesis */
AAC_MIDI = 15, /* General MIDI */
AAC_FX = 16, /* Algorithmic Synthesis and Audio FX */
AAC_LC_ER = 17, /* AAC Low complexity with error recovery */
AAC_LTP_ER = 19, /* AAC Long term prediction with error recovery */
AAC_SCALE_ER = 20, /* AAC scalable with error recovery */
AAC_TWINVQ_ER = 21, /* TwinVQ with error recovery */
AAC_BSAC_ER = 22, /* BSAC with error recovery */
AAC_LD_ER = 23, /* AAC LD with error recovery */
AAC_CELP_ER = 24, /* CELP with error recovery */
AAC_HXVC_ER = 25, /* HXVC with error recovery */
AAC_HILN_ER = 26, /* HILN with error recovery */
AAC_PARAM_ER = 27, /* Parametric with error recovery */
AAC_SSC = 28, /* AAC SSC */
AAC_HE_L3 = 31, /* Reserved : seems to be HeAAC L3 */
} aac_object_type_t;
static const struct {
dlna_profile_t *profile;
aac_container_type_t ct;
audio_profile_t ap;
} aac_profiles_mapping[] = {
{ &aac_adts, AAC_RAW, AUDIO_PROFILE_AAC },
{ &aac_adts_320, AAC_RAW, AUDIO_PROFILE_AAC_320 },
{ &aac_iso, AAC_MUXED, AUDIO_PROFILE_AAC },
{ &aac_iso_320, AAC_MUXED, AUDIO_PROFILE_AAC_320 },
{ &aac_ltp_iso, AAC_MUXED, AUDIO_PROFILE_AAC_LTP },
{ &aac_ltp_mult5_iso, AAC_MUXED, AUDIO_PROFILE_AAC_LTP_MULT5 },
{ &aac_ltp_mult7_iso, AAC_MUXED, AUDIO_PROFILE_AAC_LTP_MULT7 },
{ &aac_mult5_adts, AAC_RAW, AUDIO_PROFILE_AAC_MULT5 },
{ &aac_mult5_iso, AAC_MUXED, AUDIO_PROFILE_AAC_MULT5 },
{ &heaac_l2_adts, AAC_RAW, AUDIO_PROFILE_AAC_HE_L2 },
{ &heaac_l2_iso, AAC_MUXED, AUDIO_PROFILE_AAC_HE_L2 },
{ &heaac_l3_adts, AAC_RAW, AUDIO_PROFILE_AAC_HE_L3 },
{ &heaac_l3_iso, AAC_MUXED, AUDIO_PROFILE_AAC_HE_L3 },
{ &heaac_mult5_adts, AAC_RAW, AUDIO_PROFILE_AAC_HE_MULT5 },
{ &heaac_mult5_iso, AAC_MUXED, AUDIO_PROFILE_AAC_HE_MULT5 },
{ &heaac_l2_adts_320, AAC_RAW, AUDIO_PROFILE_AAC_HE_L2_320 },
{ &heaac_l2_iso_320, AAC_MUXED, AUDIO_PROFILE_AAC_HE_L2_320 },
{ &heaac_v2_l2, AAC_MUXED, AUDIO_PROFILE_AAC_HE_V2_L2 },
{ &heaac_v2_l2_adts, AAC_RAW, AUDIO_PROFILE_AAC_HE_V2_L2 },
{ &heaac_v2_l2_320, AAC_MUXED, AUDIO_PROFILE_AAC_HE_V2_L2_320 },
{ &heaac_v2_l2_320_adts, AAC_RAW, AUDIO_PROFILE_AAC_HE_V2_L2_320 },
{ &heaac_v2_l3, AAC_MUXED, AUDIO_PROFILE_AAC_HE_V2_L3 },
{ &heaac_v2_l3_adts, AAC_RAW, AUDIO_PROFILE_AAC_HE_V2_L3 },
{ &heaac_v2_mult5, AAC_MUXED, AUDIO_PROFILE_AAC_HE_V2_MULT5 },
{ &heaac_v2_mult5_adts, AAC_RAW, AUDIO_PROFILE_AAC_HE_V2_MULT5 },
{ &bsac_iso, AAC_MUXED, AUDIO_PROFILE_AAC_BSAC },
{ &bsac_mult5_iso, AAC_MUXED, AUDIO_PROFILE_AAC_BSAC_MULT5 },
{ NULL, 0, 0 }
};
static aac_object_type_t
aac_object_type_get (uint8_t *data, int len)
{
uint8_t t = AAC_INVALID;
if (!data || len < 1)
goto aac_object_type_error;
t = data[0] >> 3; /* Get 5 first bits */
aac_object_type_error:
#ifdef HAVE_DEBUG
fprintf (stderr, "AAC Object Type: %d\n", t);
#endif /* HAVE_DEBUG */
return t;
}
static audio_profile_t
audio_profile_guess_aac_priv (AVCodecContext *ac, aac_object_type_t type)
{
if (!ac)
return AUDIO_PROFILE_INVALID;
/* check for AAC variants codec */
if (ac->codec_id != CODEC_ID_AAC)
return AUDIO_PROFILE_INVALID;
switch (type)
{
/* AAC Low Complexity variants */
case AAC_LC:
case AAC_LC_ER:
{
if (ac->sample_rate < 8000 || ac->sample_rate > 48000)
break;
if (ac->channels <= 2) /* AAC @ Level 1/2 */
{
if (ac->bit_rate <= 320000)
return AUDIO_PROFILE_AAC_320;
if (ac->bit_rate <= 576000)
return AUDIO_PROFILE_AAC;
break;
}
else if (ac->channels <= 6)
{
if (ac->bit_rate <= 1440000)
return AUDIO_PROFILE_AAC_MULT5;
break;
}
break;
}
/* AAC Long Term Prediction variants */
case AAC_LTP:
case AAC_LTP_ER:
{
if (ac->sample_rate < 8000)
break;
if (ac->sample_rate <= 48000)
{
if (ac->channels <= 2 && ac->bit_rate <= 576000)
return AUDIO_PROFILE_AAC_LTP;
break;
}
else if (ac->sample_rate <= 96000)
{
if (ac->channels <= 6 && ac->bit_rate <= 2880000)
return AUDIO_PROFILE_AAC_LTP_MULT5;
if (ac->channels <= 8 && ac->bit_rate <= 4032000)
return AUDIO_PROFILE_AAC_LTP_MULT7;
break;
}
break;
}
/* AAC High efficiency (with SBR) variants */
case AAC_HE:
case AAC_HE_L3:
{
if (ac->sample_rate < 8000)
break;
if (ac->sample_rate <= 24000) /* HE-AAC @ Level 2 */
{
if (ac->channels > 2)
break;
if (ac->bit_rate <= 320000)
return AUDIO_PROFILE_AAC_HE_L2_320;
if (ac->bit_rate <= 576000)
return AUDIO_PROFILE_AAC_HE_L2;
break;
}
else if (ac->sample_rate <= 48000)
{
/* HE-AAC @ Level 3 */
if (ac->channels <= 2 && ac->bit_rate <= 576000)
return AUDIO_PROFILE_AAC_HE_L3;
/* HE-AAC @ Level 4/5 */
if (ac->channels <= 6 && ac->bit_rate <= 1440000)
return AUDIO_PROFILE_AAC_HE_MULT5;
break;
}
break;
}
/* AAC High efficiency v2 (with PS) variants */
case AAC_PARAM_ER:
{
if (ac->sample_rate < 8000)
break;
if (ac->sample_rate <= 24000) /* HE-AAC @ Level 2 */
{
if (ac->channels > 2)
break;
if (ac->bit_rate <= 320000)
return AUDIO_PROFILE_AAC_HE_V2_L2_320;
if (ac->bit_rate <= 576000)
return AUDIO_PROFILE_AAC_HE_V2_L2;
break;
}
else if (ac->sample_rate <= 48000)
{
/* HE-AAC @ Level 3 */
if (ac->channels <= 2 && ac->bit_rate <= 576000)
return AUDIO_PROFILE_AAC_HE_V2_L3;
/* HE-AAC @ Level 4/5 */
if (ac->channels <= 6 && ac->bit_rate <= 2880000)
return AUDIO_PROFILE_AAC_HE_V2_MULT5;
break;
}
break;
}
case AAC_BSAC_ER:
{
if (ac->sample_rate < 16000 || ac->sample_rate > 48000)
break;
if (ac->bit_rate > 128000)
break;
if (ac->channels <= 2)
return AUDIO_PROFILE_AAC_BSAC;
else if (ac->channels <= 6)
return AUDIO_PROFILE_AAC_BSAC_MULT5;
break;
}
default:
break;
}
return AUDIO_PROFILE_INVALID;
}
audio_profile_t
audio_profile_guess_aac (AVCodecContext *ac)
{
aac_object_type_t type;
if (!ac)
return AUDIO_PROFILE_INVALID;
type = aac_object_type_get (ac->extradata, ac->extradata_size);
return audio_profile_guess_aac_priv (ac, type);
}
static aac_object_type_t
aac_adts_object_type_get (AVFormatContext *ctx)
{
int fd;
unsigned char buf[4];
uint8_t t = AAC_INVALID;
ssize_t count;
if (!ctx)
return t;
fd = open (ctx->filename, O_RDONLY);
count = read (fd, buf, sizeof (buf) - 1);
t = (buf[2] & 0xC0) >> 6;
close (fd);
#ifdef HAVE_DEBUG
fprintf (stderr, "AAC Object Type: %d\n", t);
#endif /* HAVE_DEBUG */
return t;
}
static aac_container_type_t
aac_get_format (AVFormatContext *ctx)
{
int fd;
unsigned char buf[4];
aac_container_type_t ct = AAC_MUXED;
ssize_t count;
if (!ctx)
return ct;
fd = open (ctx->filename, O_RDONLY);
count = read (fd, buf, sizeof (buf) - 1);
if ((buf[0] == 0xFF) && ((buf[1] & 0xF6) == 0xF0))
{
ct = AAC_RAW;
#ifdef HAVE_DEBUG
fprintf (stderr, "AAC has an ADTS header\n");
#endif /* HAVE_DEBUG */
}
close (fd);
return ct;
}
static dlna_profile_t *
probe_mpeg4 (AVFormatContext *ctx,
dlna_container_type_t st,
av_codecs_t *codecs)
{
audio_profile_t ap;
aac_container_type_t ct = AAC_MUXED;
int i;
if (!stream_ctx_is_audio (codecs))
return NULL;
/* check for ADTS */
if (st == CT_AAC)
{
aac_object_type_t ot;
ct = aac_get_format (ctx);
ot = aac_adts_object_type_get (ctx);
ap = audio_profile_guess_aac_priv (codecs->ac, ot);
}
else
ap = audio_profile_guess_aac (codecs->ac);
if (ap == AUDIO_PROFILE_INVALID)
return NULL;
/* find profile according to container type and audio profiles */
for (i = 0; aac_profiles_mapping[i].profile; i )
if (aac_profiles_mapping[i].ct == ct &&
aac_profiles_mapping[i].ap == ap)
return aac_profiles_mapping[i].profile;
return NULL;
}
dlna_registered_profile_t dlna_profile_audio_mpeg4 = {
.id = DLNA_PROFILE_AUDIO_MPEG4,
.class = DLNA_CLASS_AUDIO,
.extensions = "aac,adts,3gp,mp4,mov,qt,m4a",
.probe = probe_mpeg4,
.next = NULL
};
标签: dlna
相关软件
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明


网友评论
我要评论