#include <stdio.h>
#include <stdlib.h>
#include <gpac/isomedia.h>
#include <gpac/internal/isomedia_dev.h>
#include <gpac/media_tools.h>
#include <gpac/constants.h>
#include "def.h"
#include "bits.h"
#include "misc.h"
#include "writemp4.h"
static void write_sample(GF_ISOSample *smp, GF_AVCConfig *avccfg, GF_M4ADecSpecInfo *acfg, u32 is_aac, u32 aac_type, GF_BitStream *bs)
{
if (!avccfg) {
if (is_aac) {
gf_bs_write_int(bs, 0xFFF, 12);
gf_bs_write_int(bs, is_aac == 1 ? 1 : 0, 1);
gf_bs_write_int(bs, 0, 2);
gf_bs_write_int(bs, 1, 1);
gf_bs_write_int(bs, aac_type, 2);
gf_bs_write_int(bs, acfg->base_sr_index, 4);
gf_bs_write_int(bs, 0, 1);
gf_bs_write_int(bs, acfg->nb_chan, 3);
gf_bs_write_int(bs, 0, 4);
gf_bs_write_int(bs, 7 + smp->dataLength, 13);
gf_bs_write_int(bs, 0x7FF, 11);
gf_bs_write_int(bs, 0, 2);
}
gf_bs_write_data(bs, smp->data, smp->dataLength);
} else {
u32 j, nal_size, remain = smp->dataLength;
u8 *ptr = smp->data;
while (remain) {
nal_size = 0;
for (j = 0; j < avccfg->nal_unit_size; j++) {
nal_size |= *ptr;
if (j + 1 < avccfg->nal_unit_size) nal_size <<= 8;
remain--;
ptr++;
}
gf_bs_write_u32(bs, 1);
if (nal_size > smp->dataLength || nal_size == 0) {
gf_bs_write_data(bs, ptr, remain);
remain = 0;
} else {
gf_bs_write_data(bs, ptr, nal_size);
ptr += nal_size;
remain -= nal_size;
}
}
}
}
static int write_raw(GF_ISOFile *fi, u32 hint, u32 data, char *fn, data_t *D, MODE mode)
{
GF_DecoderConfig *dcfg = 0;
GF_M4VDecSpecInfo dsi = { 0 };
GF_M4ADecSpecInfo acfg = { 0 };
GF_AVCConfig *avccfg = 0;
GF_BitStream *bs, *bs_tmp;
GF_ISOSample *smp = 0, *tmp = 0;
GF_HintSample *hint_smp;
GF_RTPPacket *pck;
FILE *fo;
char *pdsi = 0;
u32 i, j, k, l, h, is_aac = 0, aac_type = 0;
u32 di, count, packets, samples, last_smp = 0, m_stype, dsi_size = 0;
m_stype = gf_isom_get_media_subtype(fi, data, 1);
if (m_stype == GF_ISOM_SUBTYPE_MPEG4 || m_stype == GF_ISOM_SUBTYPE_MPEG4_CRYP)
dcfg = gf_isom_get_decoder_config(fi, data, 1);
if (dcfg) {
switch (dcfg->streamType) {
case GF_STREAM_VISUAL:
switch (dcfg->objectTypeIndication) {
case 0x20:
pdsi = dcfg->decoderSpecificInfo->data;
dsi_size = dcfg->decoderSpecificInfo->dataLength;
gf_m4v_get_config(pdsi, dsi_size, &dsi);
break;
case 0x21:
avccfg = gf_isom_avc_config_get(fi, data, 1);
break;
default:
gf_odf_desc_del((GF_Descriptor *) dcfg);
return 0;
}
break;
case GF_STREAM_AUDIO:
switch (dcfg->objectTypeIndication) {
case 0x66:
case 0x67:
case 0x68:
pdsi = dcfg->decoderSpecificInfo->data;
dcfg->decoderSpecificInfo->data = NULL;
dsi_size = dcfg->decoderSpecificInfo->dataLength;
is_aac = 1;
aac_type = dcfg->objectTypeIndication - 0x66;
break;
case 0x40:
pdsi = dcfg->decoderSpecificInfo->data;
dcfg->decoderSpecificInfo->data = NULL;
dsi_size = dcfg->decoderSpecificInfo->dataLength;
is_aac = 2;
break;
case 0x69:
case 0x6B:
break;
default:
gf_odf_desc_del((GF_Descriptor *) dcfg);
return 0;
}
break;
default:
gf_odf_desc_del((GF_Descriptor *) dcfg);
return 0;
}
} else {
switch (m_stype) {
case GF_ISOM_SUBTYPE_AVC_H264:
avccfg = gf_isom_avc_config_get(fi, data, 1);
break;
case GF_ISOM_SUBTYPE_3GP_H263: break;
default: return 0;
}
}
if (0 == (fo = fopen(fn, "wb"))) goto O;
bs = gf_bs_from_file(fo, GF_BITSTREAM_WRITE);
if (is_aac) {
gf_m4a_get_config(pdsi, dsi_size, &acfg);
if (is_aac == 2) aac_type = acfg.base_object_type - 1;
free(pdsi);
pdsi = 0;
}
if (pdsi) {
gf_bs_write_data(bs, pdsi, dsi_size);
free(pdsi);
}
if (dcfg) gf_odf_desc_del((GF_Descriptor *)dcfg);
if (avccfg) {
count = gf_list_count(avccfg->sequenceParameterSets);
for (i = 0; i < count; i++) {
GF_AVCConfigSlot *sl = gf_list_get(avccfg->sequenceParameterSets, i);
gf_bs_write_u32(bs, 1);
gf_bs_write_data(bs, sl->data, sl->size);
}
count = gf_list_count(avccfg->pictureParameterSets);
for (i = 0; i < count; i++) {
GF_AVCConfigSlot *sl = gf_list_get(avccfg->pictureParameterSets, i);
gf_bs_write_u32(bs, 1);
gf_bs_write_data(bs, sl->data, sl->size);
}
}
samples = gf_isom_get_sample_count(fi, !(mode & AUDIO) && (mode & FRAME || mode & COMPLETE) ? data : hint);
for (l = 0, i = 0; i < samples; i++) {
if (0 == (smp = gf_isom_get_sample(fi, !(mode & AUDIO) && (mode & FRAME || mode & COMPLETE) ? data : hint, i + 1, &di))) goto S;
if (mode & AUDIO) {
if (!D->F[i].lost) {
hint_smp = gf_isom_hint_sample_new(GF_ISOM_BOX_TYPE_RTP_STSD);
bs_tmp = gf_bs_new(smp->data, smp->dataLength, GF_BITSTREAM_READ);
gf_isom_hint_sample_read(hint_smp, bs_tmp, smp->dataLength);
gf_bs_del(bs_tmp);
packets = gf_list_count(hint_smp->packetTable);
for (j = 0; j < packets; j++, l++) {
pck = gf_list_get(hint_smp->packetTable, j);
count = gf_list_count(pck->DataTable);
for (k = 0; k < count; k++) {
GF_GenericDTE *dte = gf_list_get(pck->DataTable, k);
if (dte->source == 2) {
GF_SampleDTE *sdte = (GF_SampleDTE *)dte;
if (sdte->sampleNumber != last_smp) {
if (last_smp != 0) {
write_sample(tmp, avccfg, &acfg, is_aac, aac_type, bs);
gf_isom_sample_del(&tmp);
}
if (0 == (tmp = gf_isom_get_sample(fi, data, sdte->sampleNumber, 0))) goto S;
last_smp = sdte->sampleNumber;
}
}
}
}
}
}
else if (mode & FRAME || mode & COMPLETE) {
if (D->F[i].lost) {
h = 0;
if (m_stype == 'MPEG') {
if (!dsi.NumBitsTimeIncrement ||
!(h = mark_not_coded(smp->data, smp->dataLength, dsi.NumBitsTimeIncrement)))
goto E;
}
if (m_stype == 'avc1' && i == 0) h = 64;
if (smp->dataLength > 8 + h) {
if (mode & TRUNC) smp->dataLength = 8 + h;
if (mode & FILL) memset(smp->data + 8 + h, 0, smp->dataLength - (8 + h));
}
}
write_sample(smp, avccfg, 0, 0, 0, bs);
gf_isom_sample_del(&smp);
} else {
hint_smp = gf_isom_hint_sample_new(GF_ISOM_BOX_TYPE_RTP_STSD);
bs_tmp = gf_bs_new(smp->data, smp->dataLength, GF_BITSTREAM_READ);
gf_isom_hint_sample_read(hint_smp, bs_tmp, smp->dataLength);
gf_bs_del(bs_tmp);
packets = gf_list_count(hint_smp->packetTable);
for (j = 0; j < packets; j++, l++) {
pck = gf_list_get(hint_smp->packetTable, j);
count = gf_list_count(pck->DataTable);
for (k = 0; k < count; k++) {
GF_GenericDTE *dte = gf_list_get(pck->DataTable, k);
if (dte->source == 2) {
GF_SampleDTE *sdte = (GF_SampleDTE *)dte;
if (sdte->sampleNumber != last_smp) {
if (last_smp != 0) {
if (!D->P[l].lost) write_sample(tmp, avccfg, 0, 0, 0, bs);
gf_isom_sample_del(&tmp);
}
if (0 == (tmp = gf_isom_get_sample(fi, data, sdte->sampleNumber, 0))) goto S;
last_smp = sdte->sampleNumber;
}
if (D->P[l].lost && !(l == 0 && m_stype == 'avc1')) {
if (mode & FILL && sdte->dataLength > 8) {
memset(tmp->data + sdte->byteOffset + 8, 0, sdte->dataLength - 8);
}
}
}
}
}
}
}
if (tmp) write_sample(tmp, avccfg, &acfg, is_aac, aac_type, bs);
gf_isom_sample_del(&tmp);
if (avccfg)
没有合适的资源?快使用搜索试试~ 我知道了~
evalvid-2.7.zip_evalvid
共94个文件
c:21个
h:17个
vcproj:16个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 172 浏览量
2022-09-19
20:29:43
上传
评论
收藏 4.84MB ZIP 举报
温馨提示
evalvid-2.7 是一个视频分析包,可以帮助大家学习相关知识
资源详情
资源评论
资源推荐
收起资源包目录
evalvid-2.7.zip (94个子文件)
evalvid-2.7
writemp4.c 18KB
stat.c 7KB
bits.h 582B
mp4trace_vc9.vcproj 5KB
random.h 763B
miv.c 2KB
evalvid.sln 4KB
timing.c 2KB
etmp4_vc9.vcproj.WIN-WYQ.Administrator.user 1KB
mp4trace.ncb 33KB
mp4trace.c 17KB
misc.c 2KB
vsgen_vc9.vcproj.WIN-WYQ.Administrator.user 1KB
writemp4.h 188B
etmp4_vc9.vcproj 5KB
mp4trace.opt 48KB
lock.h 332B
hist.vcproj 5KB
evalvid_vc9.suo 15KB
psnr.c 5KB
eg_vc9.vcproj.WIN-WYQ.Administrator.user 1KB
misc.h 470B
etmp4.ncb 41KB
evalvid_vc9.ncb 9.6MB
mp4trace_vc9.vcproj.WIN-WYQ.Administrator.user 1KB
eg_vc9.vcproj 6KB
hist_vc9.vcproj 5KB
socket.c 3KB
etmp4.plg 12KB
hist_vc9.vcproj.WIN-WYQ.Administrator.user 1KB
miv.vcproj 5KB
error.c 1KB
dir.h 108B
eg.c 3KB
mos.vcproj 5KB
dir.c 2KB
etmp4.c 2KB
thread.h 564B
etmp4.dsw 518B
socket.h 213B
types.h 342B
timing.h 797B
mp4trace.plg 823B
vsgen.c 5KB
read.h 286B
psnr_vc9.vcproj 5KB
queue.c 4KB
vsgen.vcproj 5KB
rtp.h 2KB
stdint_w32.h 6KB
psnr_vc9.vcproj.WIN-WYQ.Administrator.user 1KB
error.h 997B
eg.vcproj 6KB
lock.c 1KB
psnr.vcproj 5KB
mos.c 3KB
bits.c 2KB
mp4trace.vcproj 6KB
Makefile 1KB
etmp4.vcproj 5KB
hist.c 1KB
mos_vc9.vcproj.WIN-WYQ.Administrator.user 1KB
random.c 3KB
read.c 5KB
evalvid_vc9.sln 4KB
etmp4.dsp 3KB
Debug
BuildLog.htm 20KB
mos.exe.embed.manifest 146B
mos.exe.embed.manifest.res 212B
etmp4.pch 2.74MB
vc60.idb 41KB
etmp4.pdb 25KB
etmp4.obj 8KB
mt.dep 67B
vc80.pdb 68KB
mos.exe.intermediate.manifest 145B
vc80.idb 203KB
vc60.pdb 52KB
mos.ilk 1.08MB
mos.obj 27KB
mos.pdb 2.03MB
mos.exe 508KB
dir.obj 20KB
etmp4.opt 48KB
miv_vc9.vcproj 5KB
vsgen_vc9.vcproj 5KB
miv_vc9.vcproj.WIN-WYQ.Administrator.user 1KB
mp4trace.dsw 524B
thread.c 449B
queue.h 1KB
def.h 755B
mos_vc9.vcproj 5KB
stat.h 568B
mp4trace.dsp 3KB
共 94 条
- 1
weixin_42651887
- 粉丝: 79
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- ISOSAE21434.D1-2020SAE美国汽车标准
- 奥比中光RGBD在JETSON ORIN NX的ROS程序
- SerialNumberUtil.java
- autojspro写的木鱼小软件,模拟木鱼的敲击声,提供源代码
- 修改windows服务器远程桌面端口批处理
- 黑马Java八股文面试题视频教程,Java面试八股文宝典(含阿里、腾迅大厂java面试真题,java数据结构,java并发
- java调用科大讯飞在线语音合成API -完整代码
- Python爬虫基础知识.zip
- Java八股文和面试项目介绍-春招秋招校招社招
- 其他类别JSP网页HTML编辑器 v1.0 beat-jsphtmleditor.7z
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0