本文整理汇总了C++中skip_bits1函数的典型用法代码示例。如果您正苦于以下问题:C++ skip_bits1函数的具体用法?C++ skip_bits1怎么用?C++ skip_bits1使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了skip_bits1函数的18个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。
示例1: ff_intel_h263_decode_picture_header
/* don't understand why they choose a different header ! */
int ff_intel_h263_decode_picture_header(MpegEncContext *s)
{
int format;
/* picture header */
if (get_bits_long(&s->gb, 22) != 0x20) {
av_log(s->avctx, AV_LOG_ERROR, "Bad picture start code\n");
return -1;
}
s->picture_number = get_bits(&s->gb, 8); /* picture timestamp */
if (get_bits1(&s->gb) != 1) {
av_log(s->avctx, AV_LOG_ERROR, "Bad marker\n");
return -1; /* marker */
}
if (get_bits1(&s->gb) != 0) {
av_log(s->avctx, AV_LOG_ERROR, "Bad H263 id\n");
return -1; /* h263 id */
}
skip_bits1(&s->gb); /* split screen off */
skip_bits1(&s->gb); /* camera off */
skip_bits1(&s->gb); /* freeze picture release off */
format = get_bits(&s->gb, 3);
if (format == 0 || format == 6) {
av_log(s->avctx, AV_LOG_ERROR, "Intel H263 free format not supported\n");
return -1;
}
s->h263_plus = 0;
s->pict_type = AV_PICTURE_TYPE_I + get_bits1(&s->gb);
s->unrestricted_mv = get_bits1(&s->gb);
s->h263_long_vectors = s->unrestricted_mv;
if (get_bits1(&s->gb) != 0) {
av_log(s->avctx, AV_LOG_ERROR, "SAC not supported\n");
return -1; /* SAC: off */
}
s->obmc= get_bits1(&s->gb);
s->pb_frame = get_bits1(&s->gb);
if (format < 6) {
s->width = ff_h263_format[format][0];
s->height = ff_h263_format[format][1];
s->avctx->sample_aspect_ratio.num = 12;
s->avctx->sample_aspect_ratio.den = 11;
} else {
format = get_bits(&s->gb, 3);
if(format == 0 || format == 7){
av_log(s->avctx, AV_LOG_ERROR, "Wrong Intel H263 format\n");
return -1;
}
if(get_bits(&s->gb, 2))
av_log(s->avctx, AV_LOG_ERROR, "Bad value for reserved field\n");
s->loop_filter = get_bits1(&s->gb);
if(get_bits1(&s->gb))
av_log(s->avctx, AV_LOG_ERROR, "Bad value for reserved field\n");
if(get_bits1(&s->gb))
s->pb_frame = 2;
if(get_bits(&s->gb, 5))
av_log(s->avctx, AV_LOG_ERROR, "Bad value for reserved field\n");
if(get_bits(&s->gb, 5) != 1)
av_log(s->avctx, AV_LOG_ERROR, "Invalid marker\n");
}
if(format == 6){
int ar = get_bits(&s->gb, 4);
skip_bits(&s->gb, 9); // display width
skip_bits1(&s->gb);
skip_bits(&s->gb, 9); // display height
if(ar == 15){
s->avctx->sample_aspect_ratio.num = get_bits(&s->gb, 8); // aspect ratio - width
s->avctx->sample_aspect_ratio.den = get_bits(&s->gb, 8); // aspect ratio - height
} else {
s->avctx->sample_aspect_ratio = ff_h263_pixel_aspect[ar];
}
if (s->avctx->sample_aspect_ratio.num == 0)
av_log(s->avctx, AV_LOG_ERROR, "Invalid aspect ratio.\n");
}
s->chroma_qscale= s->qscale = get_bits(&s->gb, 5);
skip_bits1(&s->gb); /* Continuous Presence Multipoint mode: off */
if(s->pb_frame){
skip_bits(&s->gb, 3); //temporal reference for B-frame
skip_bits(&s->gb, 2); //dbquant
}
/* PEI */
while (get_bits1(&s->gb) != 0) {
skip_bits(&s->gb, 8);
}
s->f_code = 1;
s->y_dc_scale_table=
s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
ff_h263_show_pict_info(s);
//.........这里部分代码省略.........
开发者ID:AVbin,项目名称:libav,代码行数:101,代码来源:intelh263dec.c
示例2: ff_h264_decode_ref_pic_marking
int ff_h264_decode_ref_pic_marking(H264Context *h, GetBitContext *gb,
int first_slice)
{
int i, ret;
MMCO mmco_temp[MAX_MMCO_COUNT], *mmco = mmco_temp;
int mmco_index = 0;
if (h->nal_unit_type == NAL_IDR_SLICE) { // FIXME fields
skip_bits1(gb); // broken_link
if (get_bits1(gb)) {
mmco[0].opcode = MMCO_LONG;
mmco[0].long_arg = 0;
mmco_index = 1;
}
} else {
if (get_bits1(gb)) { // adaptive_ref_pic_marking_mode_flag
for (i = 0; i < MAX_MMCO_COUNT; i++) {
MMCOOpcode opcode = get_ue_golomb_31(gb);
mmco[i].opcode = opcode;
if (opcode == MMCO_SHORT2UNUSED || opcode == MMCO_SHORT2LONG) {
mmco[i].short_pic_num =
(h->curr_pic_num - get_ue_golomb(gb) - 1) &
(h->max_pic_num - 1);
#if 0
if (mmco[i].short_pic_num >= h->short_ref_count ||
h->short_ref[ mmco[i].short_pic_num ] == NULL) {
av_log(s->avctx, AV_LOG_ERROR,
"illegal short ref in memory management control "
"operation %d\n", mmco);
return -1;
}
#endif
}
if (opcode == MMCO_SHORT2LONG || opcode == MMCO_LONG2UNUSED ||
opcode == MMCO_LONG || opcode == MMCO_SET_MAX_LONG) {
unsigned int long_arg = get_ue_golomb_31(gb);
if (long_arg >= 32 ||
(long_arg >= 16 && !(opcode == MMCO_SET_MAX_LONG &&
long_arg == 16) &&
!(opcode == MMCO_LONG2UNUSED && FIELD_PICTURE(h)))) {
av_log(h->avctx, AV_LOG_ERROR,
"illegal long ref in memory management control "
"operation %d\n", opcode);
return -1;
}
mmco[i].long_arg = long_arg;
}
if (opcode > (unsigned) MMCO_LONG) {
av_log(h->avctx, AV_LOG_ERROR,
"illegal memory management control operation %d\n",
opcode);
return -1;
}
if (opcode == MMCO_END)
break;
}
mmco_index = i;
} else {
if (first_slice) {
ret = ff_generate_sliding_window_mmcos(h, first_slice);
if (ret < 0 && h->avctx->err_recognition & AV_EF_EXPLODE)
return ret;
}
mmco_index = -1;
}
}
if (first_slice && mmco_index != -1) {
memcpy(h->mmco, mmco_temp, sizeof(h->mmco));
h->mmco_index = mmco_index;
} else if (!first_slice && mmco_index >= 0 &&
(mmco_index != h->mmco_index ||
check_opcodes(h->mmco, mmco_temp, mmco_index))) {
av_log(h->avctx, AV_LOG_ERROR,
"Inconsistent MMCO state between slices [%d, %d]\n",
mmco_index, h->mmco_index);
return AVERROR_INVALIDDATA;
}
return 0;
}
开发者ID:rzr,项目名称:Tizen_Crosswalk,代码行数:83,代码来源:h264_refs.c
示例3: h261_decode_picture_header
/**
* decodes the H261 picture header.
* @return <0 if no startcode found
*/
static int h261_decode_picture_header(H261Context *h){
MpegEncContext * const s = &h->s;
int format, i;
uint32_t startcode= 0;
for(i= get_bits_left(&s->gb); i>24; i-=1){
startcode = ((startcode << 1) | get_bits(&s->gb, 1)) & 0x000FFFFF;
if(startcode == 0x10)
break;
}
if (startcode != 0x10){
av_log(s->avctx, AV_LOG_ERROR, "Bad picture start code\n");
return -1;
}
/* temporal reference */
i= get_bits(&s->gb, 5); /* picture timestamp */
if(i < (s->picture_number&31))
i += 32;
s->picture_number = (s->picture_number&~31) + i;
#ifndef _MSC_VER
s->avctx->time_base= (AVRational){1001, 30000};
#else
//MSVC
s->avctx->time_base= av_create_rational(1001, 30000);
#endif
s->current_picture.pts= s->picture_number;
/* PTYPE starts here */
skip_bits1(&s->gb); /* split screen off */
skip_bits1(&s->gb); /* camera off */
skip_bits1(&s->gb); /* freeze picture release off */
format = get_bits1(&s->gb);
//only 2 formats possible
if (format == 0){//QCIF
s->width = 176;
s->height = 144;
s->mb_width = 11;
s->mb_height = 9;
}else{//CIF
s->width = 352;
s->height = 288;
s->mb_width = 22;
s->mb_height = 18;
}
s->mb_num = s->mb_width * s->mb_height;
skip_bits1(&s->gb); /* still image mode off */
skip_bits1(&s->gb); /* Reserved */
/* PEI */
while (get_bits1(&s->gb) != 0){
skip_bits(&s->gb, 8);
}
// h261 has no I-FRAMES, but if we pass FF_I_TYPE for the first frame, the codec crashes if it does
// not contain all I-blocks (e.g. when a packet is lost)
s->pict_type = FF_P_TYPE;
h->gob_number = 0;
return 0;
}
开发者ID:FreddyPulikottil,项目名称:ffmpeg-msvc,代码行数:73,代码来源:h261dec.c
示例4: h263_decode_picture_header
/* most is hardcoded. should extend to handle all h263 streams */
static int h263_decode_picture_header(unsigned char *b_ptr)
{
int i;
for(i=0;i<16;i++) printf(" %02X",b_ptr[i]); printf("\n");
buffer=b_ptr;
bufptr=bitcnt=buf=0;
/* picture header */
if (get_bits(&s->gb, 22) != 0x20){
printf("bad picture header\n");
return -1;
}
skip_bits(&s->gb, 8); /* picture timestamp */
if (get_bits1(&s->gb) != 1){
printf("bad marker\n");
return -1; /* marker */
}
if (get_bits1(&s->gb) != 0){
printf("bad h263 id\n");
return -1; /* h263 id */
}
skip_bits1(&s->gb); /* split screen off */
skip_bits1(&s->gb); /* camera off */
skip_bits1(&s->gb); /* freeze picture release off */
format = get_bits(&s->gb, 3);
if (format != 7) {
printf("h263_plus = 0 format = %d\n",format);
/* H.263v1 */
width = h263_format[format][0];
height = h263_format[format][1];
printf("%d x %d\n",width,height);
// if (!width) return -1;
printf("pict_type=%d\n",get_bits1(&s->gb));
printf("unrestricted_mv=%d\n",get_bits1(&s->gb));
#if 1
printf("SAC: %d\n",get_bits1(&s->gb));
printf("advanced prediction mode: %d\n",get_bits1(&s->gb));
printf("PB frame: %d\n",get_bits1(&s->gb));
#else
if (get_bits1(&s->gb) != 0)
return -1; /* SAC: off */
if (get_bits1(&s->gb) != 0)
return -1; /* advanced prediction mode: off */
if (get_bits1(&s->gb) != 0)
return -1; /* not PB frame */
#endif
printf("qscale=%d\n",get_bits(&s->gb, 5));
skip_bits1(&s->gb); /* Continuous Presence Multipoint mode: off */
} else {
printf("h263_plus = 1\n");
/* H.263v2 */
if (get_bits(&s->gb, 3) != 1){
printf("H.263v2 A error\n");
return -1;
}
if (get_bits(&s->gb, 3) != 6){ /* custom source format */
printf("custom source format\n");
return -1;
}
skip_bits(&s->gb, 12);
skip_bits(&s->gb, 3);
printf("pict_type=%d\n",get_bits(&s->gb, 3) + 1);
// if (s->pict_type != I_TYPE &&
// s->pict_type != P_TYPE)
// return -1;
skip_bits(&s->gb, 7);
skip_bits(&s->gb, 4); /* aspect ratio */
width = (get_bits(&s->gb, 9) + 1) * 4;
skip_bits1(&s->gb);
height = get_bits(&s->gb, 9) * 4;
printf("%d x %d\n",width,height);
//if (height == 0)
// return -1;
printf("qscale=%d\n",get_bits(&s->gb, 5));
}
/* PEI */
while (get_bits1(&s->gb) != 0) {
skip_bits(&s->gb, 8);
}
// s->f_code = 1;
// s->width = width;
// s->height = height;
return 0;
}
开发者ID:0p1pp1,项目名称:mplayer,代码行数:92,代码来源:vivodump.c
示例5: smka_decode_frame
/**
* Decode Smacker audio data
*/
static int smka_decode_frame(AVCodecContext *avctx, void *data,
int *got_frame_ptr, AVPacket *avpkt)
{
AVFrame *frame = data;
const uint8_t *buf = avpkt->data;
int buf_size = avpkt->size;
GetBitContext gb;
HuffContext h[4] = { { 0 } };
VLC vlc[4] = { { 0 } };
int16_t *samples;
uint8_t *samples8;
int val;
int i, res, ret;
int unp_size;
int bits, stereo;
int pred[2] = {0, 0};
if (buf_size <= 4) {
av_log(avctx, AV_LOG_ERROR, "packet is too small\n");
return AVERROR(EINVAL);
}
unp_size = AV_RL32(buf);
init_get_bits(&gb, buf + 4, (buf_size - 4) * 8);
if(!get_bits1(&gb)){
av_log(avctx, AV_LOG_INFO, "Sound: no data\n");
*got_frame_ptr = 0;
return 1;
}
stereo = get_bits1(&gb);
bits = get_bits1(&gb);
if (stereo ^ (avctx->channels != 1)) {
av_log(avctx, AV_LOG_ERROR, "channels mismatch\n");
return AVERROR(EINVAL);
}
if (bits && avctx->sample_fmt == AV_SAMPLE_FMT_U8) {
av_log(avctx, AV_LOG_ERROR, "sample format mismatch\n");
return AVERROR(EINVAL);
}
/* get output buffer */
frame->nb_samples = unp_size / (avctx->channels * (bits + 1));
if ((ret = ff_get_buffer(avctx, frame, 0)) < 0) {
av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
return ret;
}
samples = (int16_t *)frame->data[0];
samples8 = frame->data[0];
// Initialize
for(i = 0; i < (1 << (bits + stereo)); i++) {
h[i].length = 256;
h[i].maxlength = 0;
h[i].current = 0;
h[i].bits = av_mallocz(256 * 4);
h[i].lengths = av_mallocz(256 * sizeof(int));
h[i].values = av_mallocz(256 * sizeof(int));
if (!h[i].bits || !h[i].lengths || !h[i].values) {
ret = AVERROR(ENOMEM);
goto error;
}
skip_bits1(&gb);
if (smacker_decode_tree(&gb, &h[i], 0, 0) < 0) {
ret = AVERROR_INVALIDDATA;
goto error;
}
skip_bits1(&gb);
if(h[i].current > 1) {
res = init_vlc(&vlc[i], SMKTREE_BITS, h[i].length,
h[i].lengths, sizeof(int), sizeof(int),
h[i].bits, sizeof(uint32_t), sizeof(uint32_t), INIT_VLC_LE);
if(res < 0) {
av_log(avctx, AV_LOG_ERROR, "Cannot build VLC table\n");
ret = AVERROR_INVALIDDATA;
goto error;
}
}
}
/* this codec relies on wraparound instead of clipping audio */
if(bits) { //decode 16-bit data
for(i = stereo; i >= 0; i--)
pred[i] = sign_extend(av_bswap16(get_bits(&gb, 16)), 16);
for(i = 0; i <= stereo; i++)
*samples++ = pred[i];
for(; i < unp_size / 2; i++) {
if(i & stereo) {
if(vlc[2].table)
res = get_vlc2(&gb, vlc[2].table, SMKTREE_BITS, 3);
else
res = 0;
val = h[2].values[res];
if(vlc[3].table)
res = get_vlc2(&gb, vlc[3].table, SMKTREE_BITS, 3);
else
res = 0;
//.........这里部分代码省略.........
开发者ID:Brainiarc7,项目名称:libav,代码行数:101,代码来源:smacker.c
示例6: smka_decode_frame
/**
* Decode Smacker audio data
*/
static int smka_decode_frame(AVCodecContext *avctx, void *data, int *data_size, const uint8_t *buf, int buf_size)
{
GetBitContext gb;
HuffContext h[4];
VLC vlc[4];
int16_t *samples = data;
int val;
int i, res;
int unp_size;
int bits, stereo;
int pred[2] = {0, 0};
unp_size = AV_RL32(buf);
init_get_bits(&gb, buf + 4, (buf_size - 4) * 8);
if(!get_bits1(&gb)){
av_log(avctx, AV_LOG_INFO, "Sound: no data\n");
*data_size = 0;
return 1;
}
stereo = get_bits1(&gb);
bits = get_bits1(&gb);
if (unp_size & 0xC0000000 || (unp_size << !bits) > *data_size) {
av_log(avctx, AV_LOG_ERROR, "Frame is too large to fit in buffer\n");
return -1;
}
memset(vlc, 0, sizeof(VLC) * 4);
memset(h, 0, sizeof(HuffContext) * 4);
// Initialize
for(i = 0; i < (1 << (bits + stereo)); i++) {
h[i].length = 256;
h[i].maxlength = 0;
h[i].current = 0;
h[i].bits = av_mallocz(256 * 4);
h[i].lengths = av_mallocz(256 * sizeof(int));
h[i].values = av_mallocz(256 * sizeof(int));
skip_bits1(&gb);
smacker_decode_tree(&gb, &h[i], 0, 0);
skip_bits1(&gb);
if(h[i].current > 1) {
res = init_vlc(&vlc[i], SMKTREE_BITS, h[i].length,
h[i].lengths, sizeof(int), sizeof(int),
h[i].bits, sizeof(uint32_t), sizeof(uint32_t), INIT_VLC_LE);
if(res < 0) {
av_log(avctx, AV_LOG_ERROR, "Cannot build VLC table\n");
return -1;
}
}
}
if(bits) { //decode 16-bit data
for(i = stereo; i >= 0; i--)
pred[i] = bswap_16(get_bits(&gb, 16));
for(i = 0; i < stereo; i++)
*samples++ = pred[i];
for(i = 0; i < unp_size / 2; i++) {
if(i & stereo) {
if(vlc[2].table)
res = get_vlc2(&gb, vlc[2].table, SMKTREE_BITS, 3);
else
res = 0;
val = h[2].values[res];
if(vlc[3].table)
res = get_vlc2(&gb, vlc[3].table, SMKTREE_BITS, 3);
else
res = 0;
val |= h[3].values[res] << 8;
pred[1] += (int16_t)val;
*samples++ = pred[1];
} else {
if(vlc[0].table)
res = get_vlc2(&gb, vlc[0].table, SMKTREE_BITS, 3);
else
res = 0;
val = h[0].values[res];
if(vlc[1].table)
res = get_vlc2(&gb, vlc[1].table, SMKTREE_BITS, 3);
else
res = 0;
val |= h[1].values[res] << 8;
pred[0] += val;
*samples++ = pred[0];
}
}
} else { //8-bit data
for(i = stereo; i >= 0; i--)
pred[i] = get_bits(&gb, 8);
for(i = 0; i < stereo; i++)
*samples++ = (pred[i] - 0x80) << 8;
for(i = 0; i < unp_size; i++) {
if(i & stereo){
if(vlc[1].table)
res = get_vlc2(&gb, vlc[1].table, SMKTREE_BITS, 3);
else
res = 0;
pred[1] += (int8_t)h[1].values[res];
//.........这里部分代码省略.........
开发者ID:OESF-DLNA,项目名称:upnp-extension,代码行数:101,代码来源:smacker.c
示例7: parse_descriptor
//.........这里部分代码省略.........
asset->spkr_mask_enabled = 0;
asset->spkr_mask = 0;
// Representation type
asset->representation_type = get_bits(&s->gb, 3);
}
}
//
// DRC, DNC and mixing metadata
//
// Dynamic range coefficient presence flag
drc_present = get_bits1(&s->gb);
// Code for dynamic range coefficient
if (drc_present)
skip_bits(&s->gb, 8);
// Dialog normalization presence flag
if (get_bits1(&s->gb))
// Dialog normalization code
skip_bits(&s->gb, 5);
// DRC for stereo downmix
if (drc_present && asset->embedded_stereo)
skip_bits(&s->gb, 8);
// Mixing metadata presence flag
if (s->mix_metadata_enabled && get_bits1(&s->gb)) {
int nchannels_dmix;
// External mixing flag
skip_bits1(&s->gb);
// Post mixing / replacement gain adjustment
skip_bits(&s->gb, 6);
// DRC prior to mixing
if (get_bits(&s->gb, 2) == 3)
// Custom code for mixing DRC
skip_bits(&s->gb, 8);
else
// Limit for mixing DRC
skip_bits(&s->gb, 3);
// Scaling type for channels of main audio
// Scaling parameters of main audio
if (get_bits1(&s->gb))
for (i = 0; i < s->nmixoutconfigs; i++)
skip_bits_long(&s->gb, 6 * s->nmixoutchs[i]);
else
skip_bits_long(&s->gb, 6 * s->nmixoutconfigs);
nchannels_dmix = asset->nchannels_total;
if (asset->embedded_6ch)
nchannels_dmix += 6;
if (asset->embedded_stereo)
nchannels_dmix += 2;
for (i = 0; i < s->nmixoutconfigs; i++) {
if (!s->nmixoutchs[i]) {
av_log(s->avctx, AV_LOG_ERROR, "Invalid speaker layout mask for mixing configuration\n");
return AVERROR_INVALIDDATA;
}
for (j = 0; j < nchannels_dmix; j++) {
开发者ID:Ajunboys,项目名称:FFmpeg,代码行数:67,代码来源:dca_exss.c
示例8: ff_flv_decode_picture_header
int ff_flv_decode_picture_header(MpegEncContext *s)
{
int format, width, height;
/* picture header */
if (get_bits_long(&s->gb, 17) != 1) {
av_log(s->avctx, AV_LOG_ERROR, "Bad picture start code\n");
return -1;
}
format = get_bits(&s->gb, 5);
if (format != 0 && format != 1) {
av_log(s->avctx, AV_LOG_ERROR, "Bad picture format\n");
return -1;
}
s->h263_flv = format+1;
s->picture_number = get_bits(&s->gb, 8); /* picture timestamp */
format = get_bits(&s->gb, 3);
switch (format) {
case 0:
width = get_bits(&s->gb, 8);
height = get_bits(&s->gb, 8);
break;
case 1:
width = get_bits(&s->gb, 16);
height = get_bits(&s->gb, 16);
break;
case 2:
width = 352;
height = 288;
break;
case 3:
width = 176;
height = 144;
break;
case 4:
width = 128;
height = 96;
break;
case 5:
width = 320;
height = 240;
break;
case 6:
width = 160;
height = 120;
break;
default:
width = height = 0;
break;
}
if(av_check_image_size(width, height, 0, s->avctx))
return -1;
s->width = width;
s->height = height;
s->pict_type = FF_I_TYPE + get_bits(&s->gb, 2);
s->dropable= s->pict_type > FF_P_TYPE;
if (s->dropable)
s->pict_type = FF_P_TYPE;
skip_bits1(&s->gb); /* deblocking flag */
s->chroma_qscale= s->qscale = get_bits(&s->gb, 5);
s->h263_plus = 0;
s->unrestricted_mv = 1;
s->h263_long_vectors = 0;
/* PEI */
while (get_bits1(&s->gb) != 0) {
skip_bits(&s->gb, 8);
}
s->f_code = 1;
if(s->avctx->debug & FF_DEBUG_PICT_INFO){
av_log(s->avctx, AV_LOG_DEBUG, "%c esc_type:%d, qp:%d num:%d\n",
s->dropable ? 'D' : av_get_pict_type_char(s->pict_type), s->h263_flv-1, s->qscale, s->picture_number);
}
s->y_dc_scale_table=
s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
return 0;
}
开发者ID:Akuaksh,项目名称:FFmpeg-alsenc,代码行数:84,代码来源:flvdec.c
示例9: parse_dts_header
int parse_dts_header(DTSParserContext *pContext, DTSHeader *pHeader, uint8_t *pBuffer, unsigned uSize)
{
if(!pContext) return -1;
if(!pHeader) return -1;
unsigned ExtDescriptor = 0, ExtCoding = 0;
uint8_t dts_buffer[32 + FF_INPUT_BUFFER_PADDING_SIZE] = {0};
int ret = ff_dca_convert_bitstream(pBuffer, uSize, dts_buffer, 32);
bool is16be = (AV_RB32(pBuffer) == DCA_MARKER_RAW_BE);
/* Parse Core Header */
if (ret >= 0) {
pHeader->HasCore = 1;
GetBitContext *gb = pContext->gb;
init_get_bits(gb, dts_buffer, 32 << 3);
skip_bits_long(gb, 32); /* Sync code */
skip_bits1(gb); /* Frame type */
pHeader->SamplesPerBlock = get_bits(gb, 5) + 1; /* Samples deficit */
pHeader->CRCPresent = get_bits1(gb); /* CRC present */
pHeader->Blocks = get_bits(gb, 7) + 1; /* Number of Blocks */
pHeader->FrameSize = get_bits(gb, 14) + 1; /* Primary (core) Frame Size */
pHeader->ChannelLayout = get_bits(gb, 6); /* Channel configuration */
unsigned sample_index = get_bits(gb, 4); /* Sample frequency index */
pHeader->SampleRate = avpriv_dca_sample_rates[sample_index];
unsigned bitrate_index = get_bits(gb, 5); /* Bitrate index */
pHeader->Bitrate = dca_bit_rates[bitrate_index];
skip_bits1(gb); /* Down mix */
skip_bits1(gb); /* Dynamic range */
skip_bits1(gb); /* Time stamp */
skip_bits1(gb); /* Auxiliary data */
skip_bits1(gb); /* HDCD */
ExtDescriptor = get_bits(gb, 3); /* External descriptor */
ExtCoding = get_bits1(gb); /* Extended coding */
skip_bits1(gb); /* ASPF */
pHeader->LFE = get_bits(gb, 2); /* LFE */
skip_bits1(gb); /* Predictor History */
if(pHeader->CRCPresent)
skip_bits(gb, 16); /* CRC */
skip_bits1(gb); /* Multirate Interpolator */
skip_bits(gb, 4); /* Encoder Software Revision */
skip_bits(gb, 2); /* Copy history */
pHeader->ES = get_bits1(gb); /* ES */
skip_bits(gb, 2); /* PCMR (source PCM resolution) */
skip_bits1(gb); /* SUMF (Front Sum/Difference Flag) */
skip_bits1(gb); /* SUMS (Surround Sum/Difference Flag) */
skip_bits(gb, 4); /* Dialog Normalization Parameter or Unspecified (dependent on encoder version) */
} else {
pHeader->HasCore = 0;
}
if (pHeader->HasCore && !is16be)
return 0;
// DTS-HD parsing
const uint8_t *pHD = NULL;
if (pHeader->HasCore) { // If we have a core, only search after the normal buffer
if (uSize > (pHeader->FrameSize + 4)) { // at least 4 bytes extra, could probably insert a minimal size of a HD header, but so what
pHD = find_marker32_position(pBuffer + pHeader->FrameSize, uSize - pHeader->FrameSize, DCA_HD_MARKER);
}
} else {
pHD = find_marker32_position(pBuffer, uSize, DCA_HD_MARKER);
}
if (pHD) {
pHeader->IsHD = 1;
size_t remaining = uSize - (pHD - pBuffer);
parse_dts_hd_header(pContext, pHeader, pHD, (unsigned)remaining);
const uint8_t *pXChHD = find_marker32_position(pHD, remaining, DCA_XCH_MARKER);
if (pXChHD) {
size_t remaining = uSize - (pXChHD - pBuffer);
parse_dts_xch_hd_header(pContext, pHeader, pXChHD, (unsigned)remaining);
}
const uint8_t *pXXChHD = find_marker32_position(pHD, remaining, DCA_XXCH_MARKER);
if (pXXChHD) {
size_t remaining = uSize - (pXXChHD - pBuffer);
parse_dts_xxch_hd_header(pContext, pHeader, pXXChHD, (unsigned)remaining);
}
}
// Handle DTS extensions
if (ExtCoding) {
size_t coreSize = pHD ? (pHD - pBuffer) : uSize;
if (ExtDescriptor == 0 || ExtDescriptor == 3) {
const uint8_t *pXCh = find_marker32_position(pBuffer, coreSize, DCA_XCH_MARKER);
if (pXCh) {
size_t remaining = coreSize - (pXCh - pBuffer);
parse_dts_xch_header(pContext, pHeader, pXCh, (unsigned)remaining);
}
}
if (ExtDescriptor == 6) {
const uint8_t *pXXCh = find_marker32_position(pBuffer, coreSize, DCA_XXCH_MARKER);
if (pXXCh) {
size_t remaining = coreSize - (pXXCh - pBuffer);
parse_dts_xxch_header(pContext, pHeader, pXXCh, (unsigned)remaining);
}
//.........这里部分代码省略.........
开发者ID:lpl319,项目名称:lavfilters,代码行数:101,代码来源:dts.cpp
示例10: extractMpeg4Info
/*
Extract width & height from vol header passed as arg
*/
uint8_t extractMpeg4Info(uint8_t *data,uint32_t dataSize,uint32_t *w,uint32_t *h,uint32_t *time_inc)
{
// Search startcode
uint8_t b;
uint32_t idx=0;
uint32_t mw,mh;
uint32_t timeVal;
//mixDump(data,dataSize);
//printf("\n");
while(1)
{
uint32_t startcode=0xffffffff;
while(dataSize>2)
{
startcode=(startcode<<8)+data[idx];
idx++;
dataSize--;
if((startcode&0xffffff)==1) break;
}
if(dataSize>2)
{
//printf("Startcodec:%x\n",data[idx]);
if((data[idx]&0xF0)==0x20) //VOL start
{
dataSize--;
idx++;
#if 0
printf("VOL Header:\n");
if(dataSize<16)
{
mixDump(data+idx,dataSize);
printf("\n");
}
else
{
mixDump(data+idx,16);
printf("\n");
}
#endif
// Here we go !
GetBitContext s;
init_get_bits( &s,data+idx, dataSize*8);
//
skip_bits1(&s); // Random access
skip_bits(&s,8); // Obj type indication
if(get_bits(&s,1)) // VO od
{
skip_bits(&s,4); // Ver
skip_bits(&s,3); // Priority
}
if(get_bits(&s,4)==15) // custom A/R
{
skip_bits(&s,8);
skip_bits(&s,8);
}
if(get_bits(&s,1)) // Vol control param
{
skip_bits(&s,2); //Chroma
skip_bits(&s,1); // Low delay
if(get_bits(&s,1)) // VBV Info
{
skip_bits(&s,16);
skip_bits(&s,16);
skip_bits(&s,16);
skip_bits(&s,15);
skip_bits(&s,16);
}
}
skip_bits(&s,2); // Shape
skip_bits(&s,1); // Marker
timeVal=get_bits(&s,16); // Time increment
*time_inc = av_log2(timeVal - 1) + 1;
if (*time_inc < 1)
*time_inc = 1;
skip_bits(&s,1); // Marker
if(get_bits(&s,1)) // Fixed vop rate, compute how much bits needed
{
get_bits(&s, *time_inc);
}
skip_bits(&s,1); // Marker
mw=get_bits(&s,13);
skip_bits(&s,1); // Marker
mh=get_bits(&s,13);
// /Here we go
//printf("%d x %d \n",mw,mh);
*h=mh;
*w=mw;
return 1;;
// Free get bits ?
// WTF ?
}
continue;
}
//.........这里部分代码省略.........
开发者ID:BackupTheBerlios,项目名称:avidemux-svn,代码行数:101,代码来源:ADM_infoextractor.cpp
示例11: h261_decode_picture_header
/**
* Decode the H.261 picture header.
* @return <0 if no startcode found
*/
static int h261_decode_picture_header(H261Context *h)
{
MpegEncContext *const s = &h->s;
int format, i;
uint32_t startcode = 0;
for (i = get_bits_left(&s->gb); i > 24; i -= 1) {
startcode = ((startcode << 1) | get_bits(&s->gb, 1)) & 0x000FFFFF;
if (startcode == 0x10)
break;
}
if (startcode != 0x10) {
av_log(s->avctx, AV_LOG_ERROR, "Bad picture start code\n");
return -1;
}
/* temporal reference */
i = get_bits(&s->gb, 5); /* picture timestamp */
if (i < (s->picture_number & 31))
i += 32;
s->picture_number = (s->picture_number & ~31) + i;
#ifdef IDE_COMPILE
s->avctx->time_base.num = 1001;
s->avctx->time_base.den = 30000;
#else
s->avctx->time_base = (AVRational) { 1001, 30000 };
#endif
/* PTYPE starts here */
skip_bits1(&s->gb); /* split screen off */
skip_bits1(&s->gb); /* camera off */
skip_bits1(&s->gb); /* freeze picture release off */
format = get_bits1(&s->gb);
// only 2 formats possible
if (format == 0) { // QCIF
s->width = 176;
s->height = 144;
s->mb_width = 11;
s->mb_height = 9;
} else { // CIF
s->width = 352;
s->height = 288;
s->mb_width = 22;
s->mb_height = 18;
}
s->mb_num = s->mb_width * s->mb_height;
skip_bits1(&s->gb); /* still image mode off */
skip_bits1(&s->gb); /* Reserved */
/* PEI */
if (skip_1stop_8data_bits(&s->gb) < 0)
return AVERROR_INVALIDDATA;
/* H.261 has no I-frames, but if we pass AV_PICTURE_TYPE_I for the first
* frame, the codec crashes if it does not contain all I-blocks
* (e.g. when a packet is lost). */
s->pict_type = AV_PICTURE_TYPE_P;
h->gob_number = 0;
return 0;
}
开发者ID:r-type,项目名称:vice-libretro,代码行数:72,代码来源:h261dec.c
示例12: smka_decode_frame
/**
* Decode Smacker audio data
*/
static int smka_decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPacket *avpkt)
{
const uint8_t *buf = avpkt->data;
int buf_size = avpkt->size;
GetBitContext gb;
HuffContext h[4];
VLC vlc[4];
int16_t *samples = data;
uint8_t *samples8 = data;
int val;
int i, res;
int unp_size;
int bits, stereo;
int pred[2] = {0, 0};
if (buf_size <= 4) {
av_log(avctx, AV_LOG_ERROR, "packet is too small\n");
return AVERROR(EINVAL);
}
unp_size = AV_RL32(buf);
init_get_bits(&gb, buf + 4, (buf_size - 4) * 8);
if(!get_bits1(&gb)){
av_log(avctx, AV_LOG_INFO, "Sound: no data\n");
*data_size = 0;
return 1;
}
stereo = get_bits1(&gb);
bits = get_bits1(&gb);
if (unp_size & 0xC0000000 || unp_size > *data_size) {
av_log(avctx, AV_LOG_ERROR, "Frame is too large to fit in buffer\n");
return -1;
}
if (stereo ^ (avctx->channels != 1)) {
av_log(avctx, AV_LOG_ERROR, "channels mismatch\n");
return AVERROR(EINVAL);
}
if (bits && avctx->sample_fmt == AV_SAMPLE_FMT_U8) {
av_log(avctx, AV_LOG_ERROR, "sample format mismatch\n");
return AVERROR(EINVAL);
}
memset(vlc, 0, sizeof(VLC) * 4);
memset(h, 0, sizeof(HuffContext) * 4);
// Initialize
for(i = 0; i < (1 << (bits + stereo)); i++) {
h[i].length = 256;
h[i].maxlength = 0;
h[i].current = 0;
h[i].bits = av_mallocz(256 * 4);
h[i].lengths = av_mallocz(256 * sizeof(int));
h[i].values = av_mallocz(256 * sizeof(int));
skip_bits1(&gb);
smacker_decode_tree(&gb, &h[i], 0, 0);
skip_bits1(&gb);
if(h[i].current > 1) {
res = init_vlc(&vlc[i], SMKTREE_BITS, h[i].length,
h[i].lengths, sizeof(int), sizeof(int),
h[i].bits, sizeof(uint32_t), sizeof(uint32_t), INIT_VLC_LE);
if(res < 0) {
av_log(avctx, AV_LOG_ERROR, "Cannot build VLC table\n");
return -1;
}
}
}
if(bits) { //decode 16-bit data
for(i = stereo; i >= 0; i--)
pred[i] = av_bswap16(get_bits(&gb, 16));
for(i = 0; i <= stereo; i++)
*samples++ = pred[i];
for(; i < unp_size / 2; i++) {
if(i & stereo) {
if(vlc[2].table)
res = get_vlc2(&gb, vlc[2].table, SMKTREE_BITS, 3);
else
res = 0;
val = h[2].values[res];
if(vlc[3].table)
res = get_vlc2(&gb, vlc[3].table, SMKTREE_BITS, 3);
else
res = 0;
val |= h[3].values[res] << 8;
pred[1] += sign_extend(val, 16);
*samples++ = av_clip_int16(pred[1]);
} else {
if(vlc[0].table)
res = get_vlc2(&gb, vlc[0].table, SMKTREE_BITS, 3);
else
res = 0;
val = h[0].values[res];
if(vlc[1].table)
res = get_vlc2(&gb, vlc[1].table, SMKTREE_BITS, 3);
else
res = 0;
val |= h[1].values[res] << 8;
//.........这里部分代码省略.........
开发者ID:HungTDO,项目名称:Android-Video-Player-FFmpeg-and-Bitmap,代码行数:101,代码来源:smacker.c
示例13: parse_picture_type
static AVPictureType parse_picture_type(const uint8_t *buf, int buflen, CVC1HeaderParser *vc1Header)
{
AVPictureType pictype = AV_PICTURE_TYPE_NONE;
int skipped = 0;
const BYTE *framestart = buf;
if (IS_MARKER(AV_RB32(buf))) {
framestart = NULL;
const BYTE *start, *end, *next;
next = buf;
for (start = buf, end = buf + buflen; next < end; start = next) {
if (AV_RB32(start) == VC1_CODE_FRAME) {
framestart = start + 4;
break;
}
next = find_next_marker(start + 4, end);
}
}
if (framestart) {
GetBitContext gb;
init_get_bits(&gb, framestart, (buflen - (framestart-buf))*8);
if (vc1Header->hdr.profile == PROFILE_ADVANCED) {
int fcm = PROGRESSIVE;
if (vc1Header->hdr.interlaced)
fcm = decode012(&gb);
if (fcm == ILACE_FIELD) {
int fptype = get_bits(&gb, 3);
pictype = (fptype & 2) ? AV_PICTURE_TYPE_P : AV_PICTURE_TYPE_I;
if (fptype & 4) // B-picture
pictype = (fptype & 2) ? AV_PICTURE_TYPE_BI : AV_PICTURE_TYPE_B;
} else {
switch (get_unary(&gb, 0, 4)) {
case 0:
pictype = AV_PICTURE_TYPE_P;
break;
case 1:
pictype = AV_PICTURE_TYPE_B;
break;
case 2:
pictype = AV_PICTURE_TYPE_I;
break;
case 3:
pictype = AV_PICTURE_TYPE_BI;
break;
case 4:
pictype = AV_PICTURE_TYPE_P; // skipped pic
skipped = 1;
break;
}
}
} else {
if (vc1Header->hdr.finterp)
skip_bits1(&gb);
skip_bits(&gb, 2); // framecnt
if (vc1Header->hdr.rangered)
skip_bits1(&gb);
int pic = get_bits1(&gb);
if (vc1Header->hdr.bframes) {
if (!pic) {
if (get_bits1(&gb)) {
pictype = AV_PICTURE_TYPE_I;
} else {
pictype = AV_PICTURE_TYPE_B;
}
} else {
pictype = AV_PICTURE_TYPE_P;
}
} else {
pictype = pic ? AV_PICTURE_TYPE_P : AV_PICTURE_TYPE_I;
}
}
}
return pictype;
}
开发者ID:anonmangod,项目名称:LAVFilters,代码行数:73,代码来源:wmv9.cpp
示例14: get_bits
void CVC1HeaderParser::VC1ParseSequenceHeader(GetBitContext *gb)
{
hdr.profile = get_bits(gb, 2);
if (hdr.profile == PROFILE_ADVANCED) {
hdr.valid = 1;
hdr.level = get_bits(gb, 3);
skip_bits(gb, 2); // Chroma Format, only 1 should be set for 4:2:0
skip_bits(gb, 3); // frmrtq_postproc
skip_bits(gb, 5); // bitrtq_postproc
skip_bits1(gb); // postprocflag
hdr.width = (get_bits(gb, 12) + 1) << 1;
hdr.height = (get_bits(gb, 12) + 1) << 1;
hdr.broadcast = get_bits1(gb); // broadcast
hdr.interlaced = get_bits1(gb); // interlaced
skip_bits1(gb); // tfcntrflag
skip_bits1(gb); // finterpflag
skip_bits1(gb); // reserved
skip_bits1(gb); // psf
if (get_bits1(gb)) { // Display Info
int w, h, ar = 0;
w = get_bits(gb, 14) + 1;
h = get_bits(gb, 14) + 1;
if (get_bits1(gb))
ar = get_bits(gb, 4);
if (ar && ar < 14) {
hdr.ar = ff_vc1_pixel_aspect[ar];
} else if (ar == 15) {
w = get_bits(gb, 8) + 1;
h = get_bits(gb, 8) + 1;
hdr.ar.num = w;
hdr.ar.den = h;
} else {
av_reduce(&hdr.ar.num, &hdr.ar.den, hdr.height * w, hdr.width * h, 1 << 30);
}
}
// TODO: add other fields
} else {
hdr.valid = 1;
hdr.old_interlaced = get_bits1(gb); // res_y411
skip_bits1(gb); // res_sprite
skip_bits(gb, 3); // frmrtq_postproc
skip_bits(gb, 5); // bitrtq_postproc
skip_bits1(gb); // loop_filter
skip_bits1(gb); // res_x8
skip_bits1(gb); // multires
skip_bits1(gb); // rest_fasttx
skip_bits1(gb); // fastuvmc
skip_bits1(gb); // extended_mv
skip_bits(gb, 2); // dquant
skip_bits1(gb); // vstransform
skip_bits1(gb); // res_transtab
skip_bits1(gb); // overlap
skip_bits1(gb); // resync marker
hdr.rangered = get_bits1(gb);
hdr.bframes = get_bits(gb, 3);
skip_bits(gb, 2); // quant mode
hdr.finterp = get_bits1(gb);
}
}
开发者ID:Brijen,项目名称:LAVFilters,代码行数:67,代码来源:VC1HeaderParser.cpp
示例15: preview_obmc
/**
* read the next MVs for OBMC. yes this is a ugly hack, feel free to send a patch :)
*/
static void preview_obmc(MpegEncContext *s){
GetBitContext gb= s->gb;
int cbpc, i, pred_x, pred_y, mx, my;
int16_t *mot_val;
const int xy= s->mb_x + 1 + s->mb_y * s->mb_stride;
const int stride= s->b8_stride*2;
for(i=0; i<4; i++)
s->block_index[i]+= 2;
for(i=4; i<6; i++)
s->block_index[i]+= 1;
s->mb_x++;
av_assert2(s->pict_type == AV_PICTURE_TYPE_P);
do{
if (get_bits1(&s->gb)) {
/* skip mb */
mot_val = s->current_picture.motion_val[0][s->block_index[0]];
mot_val[0 ]= mot_val[2 ]=
mot_val[0+stride]= mot_val[2+stride]= 0;
mot_val[1 ]= mot_val[3 ]=
mot_val[1+stride]= mot_val[3+stride]= 0;
s->current_picture.mb_type[xy] = MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0;
goto end;
}
|
请发表评论