Initialize Tizen 2.3
[external/libtheora.git] / lib / encinfo.c
1 #include <stdlib.h>
2 #include <string.h>
3 #include "internal.h"
4 #include "enquant.h"
5 #include "huffenc.h"
6
7
8
9 /*Packs a series of octets from a given byte array into the pack buffer.
10   _opb: The pack buffer to store the octets in.
11   _buf: The byte array containing the bytes to pack.
12   _len: The number of octets to pack.*/
13 static void oc_pack_octets(oggpack_buffer *_opb,const char *_buf,int _len){
14   int i;
15   for(i=0;i<_len;i++)oggpackB_write(_opb,_buf[i],8);
16 }
17
18
19
20 int oc_state_flushheader(oc_theora_state *_state,int *_packet_state,
21  oggpack_buffer *_opb,const th_quant_info *_qinfo,
22  const th_huff_code _codes[TH_NHUFFMAN_TABLES][TH_NDCT_TOKENS],
23  const char *_vendor,th_comment *_tc,ogg_packet *_op){
24   unsigned char *packet;
25   int            b_o_s;
26   if(_op==NULL)return TH_EFAULT;
27   switch(*_packet_state){
28     /*Codec info header.*/
29     case OC_PACKET_INFO_HDR:{
30       if(_state==NULL)return TH_EFAULT;
31       oggpackB_reset(_opb);
32       /*Mark this packet as the info header.*/
33       oggpackB_write(_opb,0x80,8);
34       /*Write the codec string.*/
35       oc_pack_octets(_opb,"theora",6);
36       /*Write the codec bitstream version.*/
37       oggpackB_write(_opb,TH_VERSION_MAJOR,8);
38       oggpackB_write(_opb,TH_VERSION_MINOR,8);
39       oggpackB_write(_opb,TH_VERSION_SUB,8);
40       /*Describe the encoded frame.*/
41       oggpackB_write(_opb,_state->info.frame_width>>4,16);
42       oggpackB_write(_opb,_state->info.frame_height>>4,16);
43       oggpackB_write(_opb,_state->info.pic_width,24);
44       oggpackB_write(_opb,_state->info.pic_height,24);
45       oggpackB_write(_opb,_state->info.pic_x,8);
46       oggpackB_write(_opb,_state->info.pic_y,8);
47       oggpackB_write(_opb,_state->info.fps_numerator,32);
48       oggpackB_write(_opb,_state->info.fps_denominator,32);
49       oggpackB_write(_opb,_state->info.aspect_numerator,24);
50       oggpackB_write(_opb,_state->info.aspect_denominator,24);
51       oggpackB_write(_opb,_state->info.colorspace,8);
52       oggpackB_write(_opb,_state->info.target_bitrate,24);
53       oggpackB_write(_opb,_state->info.quality,6);
54       oggpackB_write(_opb,_state->info.keyframe_granule_shift,5);
55       oggpackB_write(_opb,_state->info.pixel_fmt,2);
56       /*Spare configuration bits.*/
57       oggpackB_write(_opb,0,3);
58       b_o_s=1;
59     }break;
60     /*Comment header.*/
61     case OC_PACKET_COMMENT_HDR:{
62       int vendor_len;
63       int i;
64       if(_tc==NULL)return TH_EFAULT;
65       vendor_len=strlen(_vendor);
66       oggpackB_reset(_opb);
67       /*Mark this packet as the comment header.*/
68       oggpackB_write(_opb,0x81,8);
69       /*Write the codec string.*/
70       oc_pack_octets(_opb,"theora",6);
71       /*Write the vendor string.*/
72       oggpack_write(_opb,vendor_len,32);
73       oc_pack_octets(_opb,_vendor,vendor_len);
74       oggpack_write(_opb,_tc->comments,32);
75       for(i=0;i<_tc->comments;i++){
76         if(_tc->user_comments[i]!=NULL){
77           oggpack_write(_opb,_tc->comment_lengths[i],32);
78           oc_pack_octets(_opb,_tc->user_comments[i],_tc->comment_lengths[i]);
79         }
80         else oggpack_write(_opb,0,32);
81       }
82       b_o_s=0;
83     }break;
84     /*Codec setup header.*/
85     case OC_PACKET_SETUP_HDR:{
86       int ret;
87       oggpackB_reset(_opb);
88       /*Mark this packet as the setup header.*/
89       oggpackB_write(_opb,0x82,8);
90       /*Write the codec string.*/
91       oc_pack_octets(_opb,"theora",6);
92       /*Write the quantizer tables.*/
93       oc_quant_params_pack(_opb,_qinfo);
94       /*Write the huffman codes.*/
95       ret=oc_huff_codes_pack(_opb,_codes);
96       /*This should never happen, because we validate the tables when they
97          are set.
98         If you see, it's a good chance memory is being corrupted.*/
99       if(ret<0)return ret;
100       b_o_s=0;
101     }break;
102     /*No more headers to emit.*/
103     default:return 0;
104   }
105   /*This is kind of fugly: we hand the user a buffer which they do not own.
106     We will overwrite it when the next packet is output, so the user better be
107      done with it by then.
108     Vorbis is little better: it hands back buffers that it will free the next
109      time the headers are requested, or when the encoder is cleared.
110     Hopefully libogg2 will make this much cleaner.*/
111   packet=oggpackB_get_buffer(_opb);
112   /*If there's no packet, malloc failed while writing.*/
113   if(packet==NULL)return TH_EFAULT;
114   _op->packet=packet;
115   _op->bytes=oggpackB_bytes(_opb);
116   _op->b_o_s=b_o_s;
117   _op->e_o_s=0;
118   _op->granulepos=0;
119   _op->packetno=*_packet_state+3;
120   return ++(*_packet_state)+3;
121 }