00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "common.h"
00021 #include "bitstream.h"
00022 #include "mpegvideo.h"
00023 #include "h264data.h"
00024
00034 static uint8_t *h264_write_nal_unit(int nal_ref_idc, int nal_unit_type, uint8_t *dest, int *destsize,
00035 PutBitContext *b2)
00036 {
00037 PutBitContext b;
00038 int i, destpos, rbsplen, escape_count;
00039 uint8_t *rbsp;
00040
00041 if (nal_unit_type != NAL_END_STREAM)
00042 put_bits(b2,1,1);
00043
00044
00045 align_put_bits(b2);
00046 rbsplen = put_bits_count(b2)/8;
00047 flush_put_bits(b2);
00048 rbsp = b2->buf;
00049
00050 init_put_bits(&b,dest,*destsize);
00051
00052 put_bits(&b,16,0);
00053 put_bits(&b,16,0x01);
00054
00055 put_bits(&b,1,0);
00056 put_bits(&b,2,nal_ref_idc);
00057 put_bits(&b,5,nal_unit_type);
00058
00059 flush_put_bits(&b);
00060
00061 destpos = 5;
00062 escape_count= 0;
00063
00064 for (i=0; i<rbsplen; i+=2)
00065 {
00066 if (rbsp[i]) continue;
00067 if (i>0 && rbsp[i-1]==0)
00068 i--;
00069 if (i+2<rbsplen && rbsp[i+1]==0 && rbsp[i+2]<=3)
00070 {
00071 escape_count++;
00072 i+=2;
00073 }
00074 }
00075
00076 if(escape_count==0)
00077 {
00078 if(dest+destpos != rbsp)
00079 {
00080 memcpy(dest+destpos, rbsp, rbsplen);
00081 *destsize -= (rbsplen+destpos);
00082 }
00083 return dest+rbsplen+destpos;
00084 }
00085
00086 if(rbsplen + escape_count + 1> *destsize)
00087 {
00088 av_log(NULL, AV_LOG_ERROR, "Destination buffer too small!\n");
00089 return NULL;
00090 }
00091
00092
00093 for (i = 0 ; i < rbsplen ; i++)
00094 {
00095 if (i + 2 < rbsplen && (rbsp[i] == 0 && rbsp[i+1] == 0 && rbsp[i+2] < 4))
00096 {
00097 dest[destpos++] = rbsp[i++];
00098 dest[destpos++] = rbsp[i];
00099 dest[destpos++] = 0x03;
00100 }
00101 else
00102 dest[destpos++] = rbsp[i];
00103 }
00104 *destsize -= destpos;
00105 return dest+destpos;
00106 }
00107